Math.abs(-2147483648)的结果
2020-10-14 本文已影响0人
lenny611
先上结果图:

正常人看到这个第一反应肯定是觉得结果有问题,Math.abs()求绝对值,为什么结果是复数?
对数字敏感的人或是稍加思考的人,就会知道,这是整数溢出了。
因为int类型的范围是2^32 -1~-232,而232正好等于2147483648,因为int值最大是2147483648-1=2147483647,所以超出了int的表示范围。而在计算机中,最大值+1得到的是最小值,最小值-1得到最大值,我们可以用下图验证:

而最小值-1则得到最大值(-2147483648-1)=2147483647

这是因为在计算机中,是用二进制来表示整数,浮点数的,而最高位表示符号位,0表示正数,1表示负数。
也就是说,在Java中32位的int,最大值和最小值表示如下:
最大值为:2147483647, 二进制: 0111 1111 1111 1111 1111 1111 1111 1111
最小值为:-2147483648,二进制:1000 0000 0000 0000 0000 0000 0000 0000
这里更深入一点可以了解下原码,反码,补码,简单介绍下就是反码是为了让计算机计算减法,而补码是为了弥补反码存在的不足,即为了有符号数中0的表示的唯一性,并且可以把减法转换成加法来运算。
正数的原码,反码,补码都一致。
负数的反码则是将除了最高位的1不变外,其他位全部取反,而负数的补码则是反码+1