将负值分配给unsigned int时会发生什么?

时间:2011-08-22 19:47:04

标签: c unsigned

  

可能重复:
  signed to unsigned conversion in C - is it always safe?

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

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

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

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

3 个答案:

答案 0 :(得分:17)

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

在声明中

unsigned int x = -1;

表达式-1的类型为int,其值为-1。初始值设定项将此值从int转换为unsigned int。签名到无符号转换的规则表示该值以模UINT_MAX + 1为模,因此-1将转换为UINT_MAX(可能是0xffffffff或{{1}如果4294967295是32位)。

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

答案 1 :(得分:6)

使用%u代替%d以打印无符号值。然后你应该看到0xFFFFFFFF。

答案 2 :(得分:0)

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