例如:
unsigned int i = ~0;
结果:我可以分配给i
和
signed int y = ~0;
结果:-1
为什么我得到 -1
?我不应该得到可以分配给 y
的最大数量吗?
最佳答案
4294967295
(又名 UINT_MAX
)和 -1
具有相同的二进制表示 0xFFFFFFFF
或 32 位全部设置为 1
。这是因为带符号的数字使用 two's complement 表示.负数的 MSB(最高有效位)设置为 1
,其值通过翻转其余位、添加 1
并乘以 -1 来确定
。因此,如果您将 MSB 设置为 1
并且其余位也设置为 1
,则翻转它们(获得 32 个零),添加 1
(得到1
)并乘以-1
,最终得到-1
。
这使得 CPU 更容易进行数学运算,因为它不需要负数的特殊异常(exception)。例如,尝试添加 0xFFFFFFFF
(-1) 和 1
。由于只有 32 位的空间,这将溢出并且结果将如预期的那样为 0
。
查看更多:
关于c - Tilde C 无符号整数与有符号整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13147790/