我想测试一下编写这段代码时会发生什么。我无法解释以下情况:
输入:5 输出:-6
#include <iostream>
int lastBit(int n){ return ~(n); }
int main() { std::cout << lastBit(5); }
计算机以非常特殊的方式表达负数。值始终存储为一系列位,并且无法引入负号,因此必须以不同的方式解决此问题:其中一个位扮演负号的角色。
但这还不是全部 - 系统必须设计为正确处理数学(理想情况下,与正数相同)。
所以例如0 == 0b00000000
。如果从 0 中减去 1,则得到 -1,但从二进制的角度来看,由于“二进制下溢” 0b00000000 - 0b00000001 == 0b11111111
,因此0b11111111 == -1
。
如果然后从 -1 中减去 1,则得到0b11111111 - 0b00000001 == 0b11111110 == -2
。但是2 == 0b00000010
,这显示了为什么-2 != ~2
(并且相同的规则适用于下一个值)。
非常简短但可能更直观的答案可能是:“-5 != ~5,因为二进制只有一个零(例如 0 == -0),所以负值总是比正值多一个”
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句