Java中基本数据类型byte的溢出问题

Java中基本数据类型byte的溢出问题

问题源于:https://www.cnblogs.com/HuoHua2020/p/12326631.html

定义两个byte类型的数据,将其之和赋值给一个新的byte类型数据

byte b1 = 1;
byte b2 = 2;
byte b = (byte)(b1+b2);
System.out.println(b);

此时结果为3,与预期一致

byte类型的数据范围为-127~128,猜想,若此时将上述代码改成

byte b1 = 67;
byte b2 = 89;
byte b = (byte)(b1+b2);
System.out.println(b);

此时编译器会不会报错?
进入cmd执行命令

结果是-100?!

上面提到byte类型的取值范围是-128~127
这个输出结果是由java编码方式决定的,Java中正数用原码表示,负数用补码表示,第一位是符号位,正数和0用0标记,负数用1标记。

byte类型的数据占用1字节,即8位,但是在进行相加运算时,系统会自动转换为int类型(4字节)进行运算

int型整数67的二进制为 0000 0000 0000 0000 0000 0100 0011‬
int型整数89的二进制为 0000 0000 0000 0000 0000 0101 1001‬‬
相加后,得到的int型整数156的二进制为 0000 0000 0000 0000 0000 1001 1100‬
在经过强制类型转换(byte)后,其结果为 1001 1100

编码的最高位为1,所以编译器认为这是一个负数
而上述提到,负数用补码表示,需要转换为原码,故取反加1
取反 0110 0011
加1 0110 0100
也就是100,因为是负数所以添上符号,结果为-100。

参考资料:

byte类型取值范围以及溢出详解|CSDN
https://blog.csdn.net/benjamin_whx/article/details/38704077

猜你喜欢

转载自www.cnblogs.com/HuoHua2020/p/12326674.html
今日推荐