今天一个新手学编程就问到这个问题,很多人第一次学编程肯定会遇到这个问题,大部分都知道是溢出之类的,用源码和补码就很容易说明
int i = -2147483648 ;这是不允许的 VS里报的错 error C4146 : 一元负运算符应用于无符号类型,结果仍为无符号类型错误,
那么我们就会想,如果非要用int存 -2147483648那么符号位和数据位共用, int的第一位二进制是符号位0是整数,1是负数
-2147483647 原码1111 1111 1111 1111 1111 1111 1111 1111
-2147483647-1=-2147483648;
由于cpu里面存的是补码计算
-2147483647 补码1000 0000 0000 0000 0000 0000 0000 0001
-1 补码1111 1111 1111 1111 1111 1111 1111 1111
得到-2147483648 补码1000 0000 0000 0000 0000 0000 0000 0000
-2147483648-1得到2147483647;
-2147483648 补码1000 0000 0000 0000 0000 0000 0000 0000
-1 补码1111 1111 1111 1111 1111 1111 1111 1111
得到 补码0111 1111 1111 1111 1111 1111 1111 1111
正好是2147483647 最大值
2147483647+1得到-2147483648;
2147483647 补码0111 1111 1111 1111 1111 1111 1111 1111
1 补码0000 0000 0000 0000 0000 0000 0000 0001
得到 补码1000 0000 0000 0000 0000 0000 0000 0000