1

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010141928/article/details/77073065
32位x86系统中,分别执行如下两条语句
(1) int num = 1 << 31;
(2) int num = -( 1<<31 );

结果一样,均为-2147483648 。

也就是说1<<31==-(1<<31)=最小负数

原因在于:

1. 0x80 00 00 00 == 1 << 31,即-2147483648(最小负数)
2, 原码与补码之和为0,也就是a + ~a + 1 = 0. 所以 -a = 1+ ~a, -(0x80000000) = 1 + 0x7fffffff(最大正数) = 0x80000000

3.1 << 31 = > -2147483648,最小负数. -(-2147483648) = 2147483647 + 1 => 最大正数 + 1 = 最小负数 = -2147483648
其实问题等价于 为什么最大的正数 + 1 变成最小的负数。

没有更多推荐了,返回首页