Java中byte的取值范围是-128~127
那么给byte类型输入128会怎么样?
public class Test {
public static void main(String[] args) {
int a = (byte)128;
System.out.println(a);
}
}
//-128
结果是-128
为什么?
计算机在存储的时候都是以二进制存储的,那么正数就不用说了,负数怎么存储?
二进制中最高位表示正负(1为负,0为正)
byte的长度为8位,那么第8位便表示正负(符号位是固定的)
说一下二进制中的原码、反码、补码的概念
先用一个正数1举例
原码:0000 0001
反码:0000 0001
补码:0000 0001
正数的原码=反码=补码
对于-1来说
原码:1000 0001
反码:1111 1110(符号位不变,其他相反)
补码:1111 1111(补码是反码+1)
按以上原理
+0的原码是0000 0000
-0的原码是1000 0000
实际上,”+0“和“-0”的原码统一为0000 0000
1000 0000没有使用,所以就将其分给了最小的负数
现在开始解答最开始的疑惑
Java的整数默认是int类型的
所以128的
原码:0000 0000 0000 0000 0000 0000 1000 0000
反码:0000 0000 0000 0000 0000 0000 1000 0000
补码:0000 0000 0000 0000 0000 0000 1000 0000
byte类型截取后8位
即:
原码:1000 0000(最高位为1,表示负数)
反码:1111 1111
补码:1000 0000
1111 1111+1不应该是1 0000 0000然后截取后8位是0000 0000吗?
在补码的过程中,符号位不能改变
前面也说了,1000 0000表示的是最小值,所以是-128
这叫上溢
在试一个129(默认int类型)
原码:0000 0000 0000 0000 0000 0000 1000 0001
反码:0000 0000 0000 0000 0000 0000 1000 0001
补码:0000 0000 0000 0000 0000 0000 1000 0001
byte类型
原码:1000 0001
反码:1111 1110
补码:1111 1111
也就是-127
有上溢那么就有下溢
以-129为例(byte最小值为-128)
先默认以int类型存储
原码:1000 0000 0000 0000 0000 0000 1000 0001
反码:1111 1111 1111 1111 1111 1111 0111 1110
补码:1111 1111 1111 1111 1111 1111 0111 1111
byte类型
原码:0111 1111
反码:0111 1111
补码:0111 1111
真值是127
注意:计算机都是以补码来存储的,正数的原码、反码、补码是一样的