黑马程序员技术交流社区

标题: 一道基础题求教 [打印本页]

作者: 开弓没有回头箭    时间: 2015-6-8 08:37
标题: 一道基础题求教
byte a1=1,a2=2,b;
b=a1+a2;
这个会报“可能损失精度”错误,意思是a1+a1是int型,但是a1和a2都是byte型啊,为什么会转成int型,这是什么原理啊
作者: 终结丶天涯    时间: 2015-6-8 08:43
本帖最后由 终结丶天涯 于 2015-6-8 08:45 编辑

不是转成int,是如果两个byte加起来超过byte类型字节长度范围,就会损失精度
作者: hellotaomi    时间: 2015-6-8 09:17
本帖最后由 hellotaomi 于 2015-6-8 09:32 编辑

byte在运算时会向上转型为int类型,所以b1+b2的结果是int类型的,但是b是byte类型的,类型不匹配所以报错。
作者: 李俊超    时间: 2015-6-8 09:49

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, 下载次数: 21)

a.JPG

作者: 八戒    时间: 2015-6-8 10:00
这样给你说吧,凡是低于int类型的两个数用+运算做运算都会默认自动提升为int型的,记住就好
作者: hnyzhlq    时间: 2015-6-8 10:09
楼上说的很好了
作者: CLAY    时间: 2015-6-8 11:00
凡是低于int类型的两个数用+运算做运算都会默认自动提升为int型的,记住就好。。。一般很少用byte的
作者: 天涯111    时间: 2015-6-8 11:17
感觉是因为里面有一个默认的类型转换(就像楼上所说的),这个是要记住的。
作者: meng12    时间: 2015-6-8 13:17
刚开始你已经把b定义为byte类型,而byte类型的值在运算时会自动转成int类型的值来进行运算,所以后面应该加上强行转换,如果你给a1和a2赋值时让它们的和大于127(byte能存储的最大值)时,就会报错
作者: 海角秋风    时间: 2015-6-8 13:20
八戒 发表于 2015-6-8 10:00
这样给你说吧,凡是低于int类型的两个数用+运算做运算都会默认自动提升为int型的,记住就好 ...

还有这个规格啊,必须记下来。。。谢谢。。。
作者: 光头强    时间: 2015-6-8 13:34
低于int类型的两个数用+运算做运算都会默认自动提升为int型的
作者: 开弓没有回头箭    时间: 2015-6-9 12:08
谢谢大家,又学了一点
作者: pp7803515    时间: 2015-6-9 13:14
学习一下。。
作者: 夏尔    时间: 2015-6-9 13:19
数值大的话超过byte型 就会损失精度
作者: micro_hx    时间: 2015-6-9 14:07
原因是这个 + 的问题 , 变量a1 ,a2在编译时期是不知道值是多少的,二值相加的就会可能造成溢出,所以编辑器会询问用户的意见,是否进行变量类型的提升,还是让其溢出。。。。所以有两种方法可以运行:
1. b = (byte)(a1+a2) ;
2. int b = a1 + a2 ;
作者: wx_iAuO26mH    时间: 2015-6-9 14:12
过来 学习下
作者: 南无ice    时间: 2015-6-9 20:43
2个低于int类型的两个数相加运算时会提升为int,运算的结果还是int.  无法赋值给(byte类型)所以会出错。这是我看视频时候记的笔记。你可以看一下,如果不是很明白看入学视频第二天里边的视频有这个内容。
作者: 风入松    时间: 2015-6-9 20:47
这种损失精度的问题看了好多了还是比较模糊。
作者: canyellwang    时间: 2015-6-9 21:00
byte太小了。 一般用int  会强制转换。、
作者: coosea128    时间: 2015-6-9 21:05
java的运算,系统默认为Int类型
作者: hopestar    时间: 2015-6-9 21:07
当a1和a2进行运算时,系统会把a1和a2运算后的结果的类型自动提升为int类型,再把int类型的结果复制给byte类型,那肯定会损失精度,当结果的值超过128时,就会报错了,而不只是损失精度这么简单了。
作者: 志强    时间: 2015-6-9 21:36
赞一下。。。。。
作者: li520    时间: 2015-6-9 21:50
你很不错
作者: 朱智琳    时间: 2015-6-9 21:52
会将数据类型提高到int类型,计算的结果是int类型,相当于将int类型赋给short型,因此会报错
作者: ym123456    时间: 2015-6-9 22:00
楼上说的很好了
作者: hieiyukina    时间: 2015-6-9 22:54
温故而知新 谢谢分享




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2