java中byte类型相加超出范围变负数解析
例:
@Test
public void t() {
byte b=127;
b+=127;
System.out.println(b);
}
最终运行得出的结果时 -2
源码解析:
public void t();
Code:
0: bipush 127 //将单字节的常量值(-128~127)推送至栈顶
2: istore_1 //将栈顶int型数值存入第二个本地变量
3: iload_1 //将第二个int型本地变量推送至栈顶
4: bipush 127 //将单字节的常量值(-128~127)推送至栈顶
6: iadd //将栈顶两int型数值相加并将结果压入栈顶
7: i2b //将栈顶int型数值强制转换成byte型数值并将结果压入栈顶
8: istore_1 //将栈顶int型数值存入第二个本地变量
9: getstatic #4 // Field java/lang/System.out:Ljava/io/PrintStream;
12: iload_1
13: invokevirtual #8 // Method java/io/PrintStream.println:(I)V
16: return
第9个指令后面的指令就不一一解释了
从第七个指令中可以清楚的看到,java帮我们将两个int类型的值的运算结果强转成了byte。
java中int类型的变量占4个字节共32位,byte类型占1个字节共8位。java在进行把int强制转换成byte的时候会忽略前24位字节,直接取后面8位。
另外运算器在运算中使用的是反码参与运算。
127+127=254,所对应的二进制为:00000000 00000000 00000000 11111110
取后8位:11111110
即运算后的结果为 11111110,因为运算时是使用的反码运算,那么就需要求出他的源码:即为 10000010
转换为10进制就是 -2
已知反码求真值请参考:http://www.jiajiajia.club/blog/artical/176