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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wyy666 中级黑马   /  2014-6-4 22:44  /  1364 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 wyy666 于 2014-6-5 09:15 编辑

byte b = 1; b = b + 1; 说说编译不能通过的理由吧

12 个回复

倒序浏览
java中整数默认的是int类型.所以b+1在运算时会默认的把 等号右边的b 自动转换成int 类型. b+1的结果是int 类型,而等号左边是byte ,int类型转换成byte需要强制转换的.这道题这么改下就可以了b =(byte)(b+1)
回复 使用道具 举报 1 0
byte精度比int 精度低,低精度能自动转换成高精度?不解
回复 使用道具 举报 1 0
北极£莜蓝 发表于 2014-6-4 22:50
java中整数默认的是int类型.所以b+1在运算时会默认的把 等号右边的b 自动转换成int 类型. b+1的结果是int  ...

byte精度比int 精度低,低精度能自动转换成高精度?不解
回复 使用道具 举报 1 0
本帖最后由 北极£莜蓝 于 2014-6-4 23:33 编辑
wyy666 发表于 2014-6-4 23:03
byte精度比int 精度低,低精度能自动转换成高精度?不解

自动类型转换byte.short.char 都可以自动转换成int类型.(小精度的可以往大的转)
强制类型转换:需要加数据类型.(大的往小的转)
例子:b = 3+7; 3是int类型,7是int类型,3+7=10也是int类型,当把常量10赋值给byte类型b时,java编译器 会进行范围检查,发现10没有超越byte类型的取值范围-128~127,所以可以正常将int类型转换为byte类型.  而 你这里的b= b+1; +1 运算时会自动提升表达式的类型即先把b自动提升类型变成int类型然后加1;,所以结果是int型,再赋值给byte 类型b时,编译器将报告需要强制转换类型的错误。

评分

参与人数 1技术分 +1 收起 理由
轻语。 + 1 很给力!

查看全部评分

回复 使用道具 举报 2 0
123_yaya 来自手机 中级黑马 2014-6-4 23:35:18
地板
北极£莜蓝 发表于 2014-6-4 23:31
自动类型转换byte.short.char 都可以自动转换成int类型.(小精度的可以往大的转)
强制类型转换:需要加数据 ...

赞一个!
回复 使用道具 举报
把b=b+1改为b=byte(b+1)即可强制类型转换
回复 使用道具 举报
wyy666 发表于 2014-6-4 23:03
byte精度比int 精度低,低精度能自动转换成高精度?不解

因为做运算时,基本类型为int型,这里b=b+1中将b进行自动类型提升,提升为int型将int型赋值给byte型b,会损失精度,所以编译不过
回复 使用道具 举报
帅哥,你得紧紧地抱住伟哥的大腿,又粗又壮,这样子才能在班里坐得住。下面回答你这个问题

整数默认类型是int(这个栾老师讲过的),作为byte类型的b在与int类型的1相加的时候,b会被自动提升为int类型,然后完成加法运算,此时此刻结果是int类型的,赋值给等号左边的类型为byte的b的时候,会在编译的时候报错:可能损失精度
由此可见这个过程是分两步来完成的

而如果你这么写b+=1;在编译的时候不会出错,因为此过程是一步完成
回复 使用道具 举报
强制转换就可以了  b =  (byte)b+1
回复 使用道具 举报
b 是byte类型,而 b + 1 在java运行计算时候的和是int类型,显然 b = b + 1;的意思是把 int 类型的b + 1的和赋值给byte类型的b,低精度类型的byte类型变量不能被高精度类型的int类型值赋值,不符合 隐式类型转换.所以会出现可能损失精度.解决方法一:byte b = 1; b = (byte)(b + 1);解决方法二::byte b = 1; b += 1;附:解决方法二中,b += 1;中"+="含有强制类型转换功能.
回复 使用道具 举报
原来技术分是这样得来的啊!
回复 使用道具 举报
f78fk 来自手机 中级黑马 2014-6-5 13:14:58
13#
常量1是int类型,和byte类型计算,byte会自动提升类型为int 计算结果也会是int类型,int类型赋值给byte类型会损失精度,所以编译不通过
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马