请教一下负号的位级运算过程

2016-10-20 14:59:09 +08:00
 likeunix
hello,everyone

int a = 0xffffffff;
int b= -a;
结果是 a 和 b 都是 0xffffffff 。
我知道补码不能表示-a ,但是为什么 a 和 b 的位是一样的?
2162 次点击
所在节点    Linux
12 条回复
juxingzhutou
2016-10-20 15:56:21 +08:00
讲真,我不知道楼主在问什么。这是什么语言都没说,而且补码为什么不能表示-a ,楼主先把补码补一补吧。
msg7086
2016-10-20 16:05:36 +08:00
超出范围了啊。
简单说,因为只有 0 没有-0 ,所以负数的最小值是没有能对应的正数的。取-a 以后会比最大值大 1 ,然后绕回 a 自己了。
wsy2220
2016-10-20 16:11:31 +08:00
@msg7086 然而 0xffffffff = -1, 0x80000000 才没有对应的正数...
jmc891205
2016-10-20 16:22:08 +08:00
b 的值是 1 啊 怎么可能还是 0xffffffff
likeunix
2016-10-20 16:31:10 +08:00
@juxingzhutou 谢谢提出错误,我改了一下问题,看下~
likeunix
2016-10-20 16:32:41 +08:00
@jmc891205 是我描述的不对,我修改了改了一下问题,再看下哈
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;
... :-)
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 显然不在这个范围内,就溢出了,所以结果不对。

你提供的例子其实是一样的情况,取反的时候溢出了
jmc891205
2016-10-20 16:59:49 +08:00
@likeunix 0x80000000 按位取反再+1 不就是 0x80000000 吗?不知道你是怎么算补码的?
likeunix
2016-10-20 17:03:53 +08:00
@irenicus 原来-a 是对 a 按位取反再加一得到的,谢谢谢谢啦
msg7086
2016-10-20 23:35:17 +08:00
@wsy2220 嗯,看题目的时候脑残了。_(:з」∠)_
msg7086
2016-10-20 23:36:20 +08:00
@wsy2220 因为题目里提到的问题实在太典型了,所以压根没去想这个数字是不是对,就直接按照 INT_MIN 去回答了……

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/314142

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX