请教一下负号的位级运算过程
- 0次
- 2021-07-01 13:57:48
- idczone
hello,everyone
int a = 0xffffffff;
int b= -a;
结果是 a 和 b 都是 0xffffffff 。
我知道补码不能表示-a ,但是为什么 a 和 b 的位是一样的?
讲真,我不知道楼主在问什么。这是什么语言都没说,而且补码为什么不能表示-a ,楼主先把补码补一补吧。
超出范围了啊。
简单说,因为只有 0 没有-0 ,所以负数的最小值是没有能对应的正数的。取-a 以后会比最大值大 1 ,然后绕回 a 自己了。
然而 0xffffffff = -1, 0x80000000 才没有对应的正数...
b 的值是 1 啊 怎么可能还是 0xffffffff
谢谢提出错误,我改了一下问题,看下~
是我描述的不对,我修改了改了一下问题,再看下哈
...
IC 工程师来回答问题了
int a = 0x80;
则 a = 0b1000_0000
-a = ~(0b1000_0000) + 1 = 0b0111_1111 + 1 = 0b1000_0000 = 0x80;
... :-)
另外:
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 显然不在这个范围内,就溢出了,所以结果不对。
你提供的例子其实是一样的情况,取反的时候溢出了
0x80000000 按位取反再+1 不就是 0x80000000 吗?不知道你是怎么算补码的?
原来-a 是对 a 按位取反再加一得到的,谢谢谢谢啦
嗯,看题目的时候脑残了。_(:з」∠)_
因为题目里提到的问题实在太典型了,所以压根没去想这个数字是不是对,就直接按照 INT_MIN 去回答了……