将无效值赋给unsigned int时会发生什么?

可能重复:
签到C中的无符号转换 – 它总是安全吗?

假设我声明了一个unsigned int类型的变量: unsigned int x = -1;

现在-1的二进制补码(假设32位机器)是0xFFFFFFFF。 现在,当我将此值赋给x时,值0x7FFFFFFF是否已分配给x?

如果是这样,则printf(“%d”,x); 会打印十进制等效的0x7FFFFFFF,对吧? 但是,显然这没有发生,因为打印的值是-1。 我在这里想念的是什么?

编辑:我知道我们可以使用%u格式说明符来打印无符号值。 但这无助于回答上述问题。

"%d"格式用于(带符号)int值。 如果使用无符号值,则可以打印除实际值以外的值。 使用"%u"查看实际值,或使用%x以hex查看。

在宣言中

 unsigned int x = -1; 

表达式-1的类型为int,其值为-1。 初始值设定项将此值从int转换为unsigned int。 有符号转换的规则表示该值以模UINT_MAX + 1减少,因此-1将转换为UINT_MAX (如果unsigned int为32位,则可能为0xffffffff4294967295 )。

您根本无法将负值分配给无符号类型的对象。 在分配之前,任何此类值都将转换为无符号类型,结果将始终> = 0。

使用%u而不是%d来打印无符号值。 然后你应该看到0xFFFFFFFF。

发生的事情是你首先将值转换为unsigned int,将0xffffffff赋值给x。 然后使用printf(“%d \ n”),您将值转换回signed int,仍然保持0xffffffff的值。 从而打印-1。