二进制 正负数加减法 计算INT_MIN - 1=INT_MAX

首先得知道,在java中,int类型占4个字节,1个字节等于8位二进制,所以int类型32位,范围是-2147483648到2147483647,

因为1000 0000, 0000 0000, 0000 0000, 0000 0000这个是-2^31=-2147483648,所以负数多一个。

然后,因为计算机CPU的运算器中只有加法器,所以减法要转化成加法来计算,所以引入了补码。

补码可以解决两同号数相减或两异号数相加的问题。

举个例子,A表示十进制数“+6”,B表示十进制数“-8”,如果把这两个数的原码直接相加,那么

    0000 0110 

+ 1000 1000

————————

    1000 1110                     

结果为-14,很明显是错的。

如果把这两个数的补码相加,那么

    0000 0110     “+6”补码

+  1111 1000      “-8”补码

————————

    1111 1110       “-2”补码

结果是-2的补码,结果是正确的。

要理解上面的补码运算,得先知道一下3点:

1、正数的原码 反码 补码完全相同。

2、负数的反码是将原码按位取反,补码=反码+1。

3、补码转原码和原码转补码的方法是一样的。

最后根据上面的计算方法,计算INT_MIN - 1的结果,看是不是等于 INT_MAX。


     1000 0000, 0000 0000, 0000 0000, 0000 0000     “-2147483648”补码

+   1111 1111,1111 1111, 1111 1111,1111 1111       “-1”补码

————————————————————————

   1 0111 1111,1111 1111, 1111 1111,1111 1111       

很明显,运算溢出了。舍去溢出的最高位,最后运算的结果是0111 1111,1111 1111, 1111 1111,1111 1111。

又因为正数的原码 反码 补码完全相同。所以0111 1111,1111 1111, 1111 1111,1111 1111就是“2147483647”补码、源码= INT_MAX。

所以,综上所述:INT_MIN - 1的结果等于 INT_MAX。





已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页