在研究这个问题前,首先需要知道计算机中的原码、反码、补码
正数的原码、反码、补码都是本身
负数的反码是将原码除符号位全部取反、补码为反码+1
例如:-1 原码:1000 0001 反码:1111 1110 补码:1111 1111
将补码在求补码就是原码本身
在计算机中是没有减法的,所以例如:2-1 其实计算机计算的时候是 :2+(-1)
计算机在实际运算时是用补码进行运算的。
例如:1 - 2
1的原码: 0000 0001
-2的原码: 1000 0010 反码: 1111 1101 补码: 1111 1110
1+(-2)的计算为:
0000 0001
+ 1111 1110
= 1111 1111
1111 1111 反码: 1000 0000 补码: 1000 0001 -> -1
所以1-2的结果为 -1
问题:byte a = 127 byte b = 127 + 1 是多少呢? 127是byte的最大值 在不考虑自动类型提升到short的情况下a 的值会是什么呢?
byte a = 127;
byte b = (byte) (a +1); // 需要进行类型转换
System.out.println(b); // -128
为什么结果会是-128呢? 我们可以尝试用二进制计算下:
127 + 1 :
0111 1111
+ 0000 0001
= 1000 0000 反码:1111 1111 补码:1 0000 0000 -> 256 (不过-0 这个二进制是不能求反码和补码的)
1000 0000 如果按正常逻辑来看这个数应该表示的是 -0,但是 -0 和 0 没有任何区别,这样岂不是会浪费,所以就规定使用 1000 0000来表示-128
最终总结一下:为什么byte的范围是-128~127 ,原因就是-0 表示0最小位。
附加:十六进制的问题,十六进制其实就是将二进制从右到左没四位合成一位。0x代表十六进制 0 代表八进制
例如:十六进制的0x5 就是二进制的 0101
int类型的最大值在Integer包装类型中定义了个常量:0x7fffffff
十六进制表示为:
0111 1111 1111 1111 1111 1111 1111 1111
所以int类型的最大值为 2^31(2147483647)
最小值同理 -2^31-1(-2147483648)
网友评论