题目如下:
public static void main(String[] args) {
Byte a = 127;
System.out.println(++a);
System.out.println(++a);
System.out.println(++a);
}
输出结果:
-128
-127
-126
恩,相信有些人是感觉有点懵逼的。我刚开始也是,后来想到了,首先byte的范围为-128~127。字节长度为8位,最左边的是符号位,而127的二进制为:0111 1111,所以执行++a时,0111 111变为1000 0000。大家知道,计算机中存储负数,存的是补码的形式。左边第一位 为符号位。
那么 java中负数的补码转换成十进制如下:
一个数如果为正,则它的原码、反码、补码相同;一个正数的补码,将其转化为十进制,可以直接转换。
已知一个负数的补码,将其转换为十进制数,步骤:
1、先对各位取反;
2、将其转换为十进制数;
3、加上负号,再减去1。
例如:
11111010,最高位为1,是负数,先对各位取反得00000101,转换为十进制数得5,加上负号得-5,再减1得-6。
来一张有说服力的图:
由图可知,127的补码,原码,反码 都为 0111 1111,那么加上1 变成 1000 0000,此时将1000 0000(左边第一位是1,负数,取补码)转换成二进制是多少呢? 可以根据图查看,也可以根据上面的方法自己算。
1.先对各位取反,为 0111 1111
2.转成二进制 127.
3.加上负号 -127 再减去1 为 -128.所以第一次输出结果是 -128
再往下看 第二个输出是-127,怎么来的呢? 第一次加完 计算机得到 1000 0000,再加1,变成 1000 0001,转成二进制
1.先对各位取反,为 0111 1110
2.转成二进制 126
3.加上负号 -126 再减去1 为 -127.
第三次输出类似.
亲测,谢谢。