在二进制中,用最高位来表示整数和负数。
比如
System.out.println(Integer.toBinaryString(1)); System.out.println(Integer.toBinaryString(-1));
会输出
整数前面的0被省略了。
或者这样
public void test(){ System.out.println(Integer.toBinaryString(Integer.MAX_VALUE)); System.out.println(Integer.toBinaryString(-1)); }
输出
显而易见,最大值前面省略了一个0。
应该是
01111111111111111111111111111111
这也解释了我一直以来的困惑。
所以,最高位如果是0则表示正数,如果为1则表示为负数。
在计算机中,负数以其正值的补码形式表达。
比如
System.out.println(Integer.toBinaryString(33)); System.out.println(Integer.toBinaryString(-33));
输出
我们取后八位,好显示
00100001(33)
11011111(-33)
正数变为负数的过程为1.取反,2.加1
①取反
00100001 取反为
11011110
②加1
11011110加1后为
11011111
所以-33的二进制表示为
11011111
表达的什么玩意啊。。。
参见: