A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 13533258481 中级黑马   /  2015-11-1 22:49  /  403 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

byte a=3,byte b=4;为什么byte x=a+b;会出现损失精度的情况.而byte x=3+4却可以编译通过.

评分

参与人数 1黑马币 +16 收起 理由
poppy + 16

查看全部评分

9 个回复

倒序浏览
3和4为常量 java有常量识别机制 所以byte x=3+4能编译通过,而a和b为变量,虚拟机在接受时不知道a和b的值,所以报错
回复 使用道具 举报
byte x=3+4  系统默认先计算3 + 4 = 7 不超过byte的精度,赋值成功;但是a+b是转换成int类型进行运算的,结果是int类型的 比byte的类型高,只能强化(还有char和short参与运算都是需要强转的)
回复 使用道具 举报

顶顶顶顶顶顶顶顶顶顶!!!!!!!!!!!!
回复 使用道具 举报
byte x=a+b;会出现损失精度的情况. // a+b会提升为int型相加得到int型,它赋值给byte类型的,所以是会损失精度
而byte x=3+4却可以编译通过 // 常数相加,java编译器会判断值是否超出byte的取值范围,没超过就可以赋值过去,这  个是java虚拟机的常量优化机制
回复 使用道具 举报
  不懂呀
回复 使用道具 举报
byte short char 计算时都自动转为int型 所以a+b是变量相加,计算后结果为int型 直接赋值给byte x 会损失精度  因为byte空间小 int空间大
而byte x =3+4; 则是常量相加,结果为7 符合byte 的范围-128~127于是赋值给x, 所以不会报错
回复 使用道具 举报
学习下,不错!
回复 使用道具 举报
回复 使用道具 举报
poppy 中级黑马 2015-11-5 21:49:24
10#
顶一下。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马