Tilde C unsigned vs signed integer

use*_*914 2 c bit-manipulation operators tilde

例如:

unsigned int i = ~0;
Run Code Online (Sandbox Code Playgroud)

结果:我可以分配的最大数量i

signed int y = ~0;
Run Code Online (Sandbox Code Playgroud)

结果:-1

我为什么要这样-1?我不应该得到我可以指定的最大数量y吗?

kic*_*hik 7

两者4294967295(又名UINT_MAX)和-1具有相同的二进制表示0xFFFFFFFF或32位全部设置为1.这是因为带符号的数字用二进制补码表示.负数将其MSB(最高有效位)设置为,1并通过翻转其余位,添加1和乘以确定其值-1.因此,如果您将MSB设置为1并且其余位也设置为1,则将它们翻转(获得32个零),添加1(获取1)并乘以-1最终获得-1.

这使得CPU更容易进行数学计算,因为它不需要负数的特殊例外.例如,尝试添加0xFFFFFFFF(-1)和1.由于只有32位的空间,这将溢出,结果将0如预期的那样.

更多信息请访问:

http://en.wikipedia.org/wiki/Two%27s_complement


Dan*_*her 5

unsigned int i  = ~0;
Run Code Online (Sandbox Code Playgroud)

结果:我可以分配给i的最大数量

通常,但不一定.表达式~0求值为a设置了int所有(非填充)位.C标准允许对有符号整数进行三次表示,

  • 两个补码,在这种情况下~0 = -1,并将其分配给unsigned int结果(-1) + (UINT_MAX + 1) = UINT_MAX.
  • 一个补码,在这种情况下~0是负零或陷阱表示; 如果它是负零,则分配unsigned int结果为0.
  • 签和幅度,在这种情况下~0INT_MIN == -INT_MAX,并将其分配给一个unsigned int在结果中(UINT_MAX + 1) - INT_MAX,这是1在不太可能的情况下,unsigned int具有一宽度(值的位的数目为无符号整数类型,数量值的位的+ 1 [对符号位]对于有符号整数类型)小于int2^(WIDTH - 1) + 1在宽度unsigned int相同的常见情况下的宽度int.

初始化

unsigned int i = ~0u;
Run Code Online (Sandbox Code Playgroud)

总会导致i持有价值UINT_MAX.

signed int y = ~0;
Run Code Online (Sandbox Code Playgroud)

结果:-1

如上所述,只有当有符号整数的表示使用二进制补码时(现在这是迄今为止最常见的表示).