为什么两个byte类型的数据相加会报错?

如下程序1:
byte b1 = 4;
byte b2 = 3;
byte b3;
b3 = b1 + b2;
System.out.println(b3);
上述程序在编译时会报错,提示内容为:int转换为byte类型时可能会造成精度的缺失。
而下面程序2、3均不会报错
程序2:
int b1 = 4;
int b2 = 3;
int b3;
b3 = b1 + b2;
System.out.println(b3);
程序3:
byte b1 = 127;
byte b2 = 5;
int b3;
System.out.println(b3);
并且程序3的输出结果为132,也不会发生精度的缺失,输入结果如下
在这里插入图片描述
很疑惑所以去上网搜了相关的知识点,经过查阅后得出以下结论:
这是由于java的运算机制所导致的。计算机中默认整数数据类型为int型,默认浮点数为doule型。java中,在进行byte数据类型运算时是将它提升为int类型后,再进行计算的,如果没有强制类型转换,它的结果就为int类型了。所以两个byte类型相加等于int是不会报错的,而两个byte相加等于byte,编译就会报错,提示可能造成精度缺失

这是我在进行两个byte相加时出现的错误。查阅资料时,还整理了其他类型的相关错误,整理如下(以下结论均进行过代码编译运行验证):
在java数据类型的运算中,有如下机制
1、两个byte相加,会自动提升为int类型,其结果也为int类型(所以不用担心结果超出127会不会造成精度缺失,它是先提升为int在进行运算,只有你强转为byte时才可能会精度缺失)
2、同理,两个short相加也会自动提升为int类型,运算结果也为int型
3、char类型的两个字符相加时(代表着两个字符的ASCII码值得相加),也自动提升为int类型,运算结果也为int型。(而java中char数据类型本身占2个字节)
4、float类型的两个变量相加时,会自动提升为doule类型,运算结果也为double类型(这是我的猜想。因为java中默认的浮点数类型为double,所以我进行了猜想验证,让两个float类型浮点数相加,其结果等于另一个float类型的变量,结果就会报错,并提示如下。而我变换为double,就成功运行得出正确结果了。证明了我猜想的正确性。
在这里插入图片描述

总结:在java中,当整数类型的变量进行运算时,凡是比int数据范围小的,会自动提升为int类型(有一个特殊的是char类型变量相加时,也提升为int),其运算结果也为int类型。浮点数运算时,变量会自动提升为double类型,结果也为double类型。

注意:这里说的运算都是指变量,常量系统会进行相应的判定,超出数的范围,也会报错如:
byte b4 = 127 + 5;
会报错
在这里插入图片描述
而byte b4 = 3 + 4;就不会报错直接输出结果7

补充:而比int还大的long数据类型,就比较特殊了,定义时
long a = 12165847987l;最后必须加字母l,不然直接报错
两个long类型的变量相加,自然不会变成int型,它比int数据范围大的多,运算结果也为long

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值