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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 开弓没有回头箭 中级黑马   /  2015-6-8 08:37  /  1376 人查看  /  25 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

byte a1=1,a2=2,b;
b=a1+a2;
这个会报“可能损失精度”错误,意思是a1+a1是int型,但是a1和a2都是byte型啊,为什么会转成int型,这是什么原理啊

25 个回复

倒序浏览
本帖最后由 终结丶天涯 于 2015-6-8 08:45 编辑

不是转成int,是如果两个byte加起来超过byte类型字节长度范围,就会损失精度
回复 使用道具 举报
本帖最后由 hellotaomi 于 2015-6-8 09:32 编辑

byte在运算时会向上转型为int类型,所以b1+b2的结果是int类型的,但是b是byte类型的,类型不匹配所以报错。
回复 使用道具 举报

1.java中的自动类型提升问题:

正向过程:由低字节向高字节自动转换

byte->short->int->long->float->double


逆向过程:使用强制转换,可能丢失精度。

int a=(int)3.14;

2. char:Java中用" \u四位十六进制的数字 (即使在注释中出现\u,后面如果跟的不是4个数字,也会报错)"表示将字符转换成对应的unicode编 码,字符类型要用单引号括起来。

3、黙认浮点类型为double,float数据类型有一个后缀为" f "或" F "。

4、long类型有一个后缀,为" l " 或者" L "

byte a = 1;

byte b = 2;

a = a+b;          //编译出错自动类型提升成int

a += b;       //自加没有自动类型提升问题

类型自动提升规则:

a和b作某种运算

a和b中有double,结果就是double

a和b中有float,结果就是float

a和b中有long,结果就是long

除此之外,结果都是int

把高字节转成低字节,需要作强制类型转换. byte c=(byte)a+b;


a.JPG (39.72 KB, 下载次数: 25)

a.JPG
回复 使用道具 举报 1 0
这样给你说吧,凡是低于int类型的两个数用+运算做运算都会默认自动提升为int型的,记住就好
回复 使用道具 举报
楼上说的很好了
回复 使用道具 举报
CLAY 中级黑马 2015-6-8 11:00:51
7#
凡是低于int类型的两个数用+运算做运算都会默认自动提升为int型的,记住就好。。。一般很少用byte的
回复 使用道具 举报
感觉是因为里面有一个默认的类型转换(就像楼上所说的),这个是要记住的。
回复 使用道具 举报
刚开始你已经把b定义为byte类型,而byte类型的值在运算时会自动转成int类型的值来进行运算,所以后面应该加上强行转换,如果你给a1和a2赋值时让它们的和大于127(byte能存储的最大值)时,就会报错
回复 使用道具 举报
八戒 发表于 2015-6-8 10:00
这样给你说吧,凡是低于int类型的两个数用+运算做运算都会默认自动提升为int型的,记住就好 ...

还有这个规格啊,必须记下来。。。谢谢。。。
回复 使用道具 举报
低于int类型的两个数用+运算做运算都会默认自动提升为int型的
回复 使用道具 举报
谢谢大家,又学了一点
回复 使用道具 举报
学习一下。。
回复 使用道具 举报
数值大的话超过byte型 就会损失精度
回复 使用道具 举报
原因是这个 + 的问题 , 变量a1 ,a2在编译时期是不知道值是多少的,二值相加的就会可能造成溢出,所以编辑器会询问用户的意见,是否进行变量类型的提升,还是让其溢出。。。。所以有两种方法可以运行:
1. b = (byte)(a1+a2) ;
2. int b = a1 + a2 ;
回复 使用道具 举报
过来 学习下
回复 使用道具 举报
2个低于int类型的两个数相加运算时会提升为int,运算的结果还是int.  无法赋值给(byte类型)所以会出错。这是我看视频时候记的笔记。你可以看一下,如果不是很明白看入学视频第二天里边的视频有这个内容。
回复 使用道具 举报
这种损失精度的问题看了好多了还是比较模糊。
回复 使用道具 举报
byte太小了。 一般用int  会强制转换。、
回复 使用道具 举报
java的运算,系统默认为Int类型
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马