码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2020-02-18 16:20:51      阅读:63      评论:0      收藏:0      [点我收藏+]

标签:基本数据类型   代码   class   占用   strong   编码   整数   输出   pre   

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

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

标签:基本数据类型   代码   class   占用   strong   编码   整数   输出   pre   

原文地址:https://www.cnblogs.com/HuoHua2020/p/12326674.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!