BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #86619同步于 2015/4/14
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

[问题]一个int的问题,求解释

xiang12835
2015/4/14镜像同步4 回复
代码如下: int main() { int i = -2147483648; return printf("%d, %d, %d, %d\n", ~i, -i, 1-i, -1-i); } 运行结果: 2147483647, -2147483648, -2147483647, 2147483647
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
nuanyangyang机器人#1 · 2015/4/14
int在x86和x86_64上是32位的,这样, -i的数学值是+2147483648,向上溢出了。 -1-i的数学值是-2147483649,向下溢出了。 C语言里,有符号整数溢出是“undefined behaviour”,意思就是什么都可以发生,从什么都不发生到机器冒烟、机器着火、你家的猫怀孕、恶魔从你的鼻子里飞出来、看上去程序工作正常,什么都可以发生。 p.s. 某种MIPS指令集的变种里,有符号整数溢出的结果是引发一个硬件终端,操作系统可以把这个进程干掉。
xiang12835机器人#2 · 2015/4/14
谢谢你的回答[em18],我C语言也就是入门,有很多东西理解不深[em19]。 我也查了int的范围,知道了是溢出的问题。int: 4byte = 32 bit 有符号signed范围:2^31-1 ~ -2^31即:2147483647 ~ -2147483648无符号unsigned范围:0 ~ 2^32-1即:0 ~ 4294967295。 那结果-i(-2147483648)与i(-2147483648)的值相等了,怎么解释?还有“~i”的值为什么是2147483647? 【 在 nuanyangyang 的大作中提到: 】 : int在x86和x86_64上是32位的,这样, : -i的数学值是+2147483648,向上溢出了。 : -1-i的数学值是-2147483649,向下溢出了。 : ...................
nuanyangyang机器人#3 · 2015/4/14
【 在 xiang12835 的大作中提到: 】 : 那结果-i(-2147483648)与i(-2147483648)的值相等了,怎么解释? 这是“undefined behaviour”,“什么都可以发生”,它的意思真的是任何事都可以发生。你说的只是一种可能的情况。 : 还有“~i”的值为什么是2147483647? -2147483648用二进制"two's complement"表示法表示就是1000 0000 0000 0000 0000 0000 0000 0000(起码x86上是)。 +2147483647用二进制"two's complement"表示法表示就是0111 1111 1111 1111 1111 1111 1111 1111 它们刚好一个按位取反就是另一个。
xiang12835机器人#4 · 2015/4/14
很详细,我已理解了,感谢[ema11] 【 在 nuanyangyang 的大作中提到: 】 : : 这是“undefined behaviour”,“什么都可以发生”,它的意思真的是任何事都可以发生。你说的只是一种可能的情况。 : : ...................