Java的开发面试题里面经常爱问关于primitive types的范围之类的问题,例如一个short能表达的整数值范围是多少,诸如此类的。这种题型的目的是看看程序员对于Java Fundamental到底了解多少,实际上有的刁钻问题甚至连老鸟都能蒙住……
看到一道蛮有意思的基础问题,贴出来一起学习一下:
int min = 0x80000000; // minimum integer int opp = -min; // get opposite number int sum = min + opp;问min, opp, 和sum求出来是多少?
首先要明确一点,对于32bit的整形int而言,0x80000000所表示的是多少?
因为最高位是符号位(sign),所以最大的int所代表的是0x7FFFFFFF,换算为十进制(decimal)也就是2147483647。
根据补码的定义,最小的32bit int应该是0x80000000,因此换算为十进制的值就是-2147483648.
在Java中,如果用int来存储这个MIN的相反数,得到的还是它自身。看起来这个结果很无厘头,1的相反数是-1;2的相反数是-2;为什么到了最大的负数这里它的相反数就是它自身呢??
因为最高位是符号位(sign),所以最大的int所代表的是0x7FFFFFFF,换算为十进制(decimal)也就是2147483647。
根据补码的定义,最小的32bit int应该是0x80000000,因此换算为十进制的值就是-2147483648.
在Java中,如果用int来存储这个MIN的相反数,得到的还是它自身。看起来这个结果很无厘头,1的相反数是-1;2的相反数是-2;为什么到了最大的负数这里它的相反数就是它自身呢??
为什么为什么为什么……
原因在于补码计算相反数。先取反,再加一。
0x80000000 -> 0x7FFFFFFF -> 0x80000000
所以就得到了上面的结果——min的相反数还是自身。
因此, (0x80000000) = -0x80000000 = -2147483648
原因在于补码计算相反数。先取反,再加一。
0x80000000 -> 0x7FFFFFFF -> 0x80000000
所以就得到了上面的结果——min的相反数还是自身。
因此, (0x80000000) = -0x80000000 = -2147483648
有了上面的结果,最后一个求和的结果就相对容易理解了。
两个最小整数相加之后,结果溢出了,最后所能够得到的sum就是0。
两个最小整数相加之后,结果溢出了,最后所能够得到的sum就是0。
评论