Java 中 int 类型的二进制表示

原理

可通过 Integer.MAX_VALUE 和 Integer.MIN_VALUE 查看 int 类型的最大和最小值,分别为 0x7fffffff(2^31-1) 和 0x80000000(2^31),其中 0 即为 0,正数的最高位为 0,负数的最高位为 1。

Java 中负数的表示方式为正数的补码(例:原码 00,反码 11,补码 00,补码的计算方式为反码加一,此处丢弃溢出位)。采用这种方式的原因是 0 的交叉(zero crossing)问题,即 0 和 -0 需要用同一种方式表示,见补码计算例子。如果采用反码表示负数的话,0 就会有两种表示:所有位全为 0、所有位全为 1。

因此 Java 中 0 的所有位全为 0,1 为 0000…0001,-1 的所有位全为 1,Integer.MAX_VALUE 为 0111…1111,Integer.MIN_VALUE 为 1000…0000。

注意事项

在 Math.abs() 的文档中可以看到如下文字:

1
Note that if the argument is equal to the value of {@link Integer#MIN_VALUE}, the most negative representable {@code int} value, the result is that same value, which is negative.

由上述原理可知,由于 Integer.MIN_VALUE 首位为 1,则其为负数,因此 Math.abs() 会取其相反数。而相反数的运算方式为补码,1000…0000 先取反得到 0111…1111,再加一,则循环回到自己 1000…0000。因此在对 Integer.MIN_VALUE 取相反数时永远会得到自己。

来源

LeetCode 7. Reverse Integer 中的一个 Integer.MIN_VALUE 的 test case。