1
juxingzhutou 2016-10-20 15:56:21 +08:00
讲真,我不知道楼主在问什么。这是什么语言都没说,而且补码为什么不能表示-a ,楼主先把补码补一补吧。
|
2
msg7086 2016-10-20 16:05:36 +08:00 via Android
超出范围了啊。
简单说,因为只有 0 没有-0 ,所以负数的最小值是没有能对应的正数的。取-a 以后会比最大值大 1 ,然后绕回 a 自己了。 |
4
jmc891205 2016-10-20 16:22:08 +08:00
b 的值是 1 啊 怎么可能还是 0xffffffff
|
5
likeunix OP @juxingzhutou 谢谢提出错误,我改了一下问题,看下~
|
7
irenicus 2016-10-20 16:54:26 +08:00
...
IC 工程师来回答问题了 int a = 0x80; 则 a = 0b1000_0000 -a = ~(0b1000_0000) + 1 = 0b0111_1111 + 1 = 0b1000_0000 = 0x80; ... :-) |
8
irenicus 2016-10-20 16:59:10 +08:00
另外:
int a = 0xff; 则 a = 0b1111_1111; -a = ~(0b1111_1111) + 1 = 0b0000_0000 + 1 = 0b0000_0001 = 0x01; 这个例子其实是 a=-1 ,那么-a 当然就是 1 了 前一个例子, a=-128 ,但是 8 位的表示范围是-128~127 ,那么-a = 128 显然不在这个范围内,就溢出了,所以结果不对。 你提供的例子其实是一样的情况,取反的时候溢出了 |