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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

1黑马币
“int x=3;byte b=4;x=x+b,”这是对的,那为什么“byte b1=3;byte b2=4;byte b3=b1+b2"这个表达就是错的呢
除了强制转换错误
解释的是b1和b2是两个变量,变量存储的值是变化的,在编译的 时候无法判断具体的值,相加有可能会超过byte的取值

那 x跟b不也是两个变量吗?x=x+b为什么就是对的呢,求解

最佳答案

查看完整内容

比如: byte b1=127; byte b2=4; byte b3=(byte) (b1+b2); System.out.println(3); 得到的结果就是3,明显结果就是错的,超过了字节的限定范围

23 个回复

倒序浏览
比如:
byte b1=127;
byte b2=4;
byte b3=(byte) (b1+b2);
System.out.println(3);
得到的结果就是3,明显结果就是错的,超过了字节的限定范围
回复 使用道具 举报
因为byte b3=b1+b2,中的b1,b2在做运算的时候都会自动提升为int, int  X=b1+b2;结果接受的是byte,嘛,所以
错了,而前者int x=3;byte b=4;x=x+b,”x 为int类型的数嘛,没错!!
回复 使用道具 举报
柳春华 发表于 2016-4-3 17:18
因为byte b3=b1+b2,中的b1,b2在做运算的时候都会自动提升为int, int  X=b1+b2;结果接受的是byte,嘛,所以
错 ...

你没看懂我提问的意思,那我问你 b3=(byte)(b1+b2) 这个对不对,如果不对 为什么
回复 使用道具 举报
x+b制动提升为int类型了呀,x是int类型的,所以是对的呀
回复 使用道具 举报
doglovely 发表于 2016-4-3 17:56
x+b制动提升为int类型了呀,x是int类型的,所以是对的呀

并不是讨论“失去精度”问题,我的提问点是那句解释的话,麻烦看清楚
回复 使用道具 举报
b3=(byte)(b1+b2) 这个编译运行是没有问题的,如果你知道b1+b2相加的值没有超过字节的限定范围(-127到128)就是对的,但是如果b1+b2超过了字节的限定范围-128到127它就会损失精确度,得到的结果就是错的。不知道你是要问的这个吗?
回复 使用道具 举报
lqqwqq 来自手机 中级黑马 2016-4-3 18:47:24
8#
wksvo 发表于 2016-4-3 17:49
你没看懂我提问的意思,那我问你 b3=(byte)(b1 b2) 这个对不对,如果不对 为什么 ...

这个 b3 = (byte)(b1 + b2) ;是对的,但是得到的b3的结果可能会出乎意料,即如果和的结果超出byte的取值范围就会得不到想要的结果。
回复 使用道具 举报
这个问题简单,我就直接给你解释左边那句x=x+b;byte要提升为int,也就是int+int;而两个int类型进行相加运算  java内部机制会默认int运算,一旦超出这个范围,他自动底层有强制转换过程,保留自己原有位置、高位全舍弃  这就是byte和int的区别,int属于默认类型,他就没有byte那样的问题
回复 使用道具 举报
补充: byte和short类型“变量”,相加不能确定结果,无法检查,也不是默认类型,所以byte、short类型相加的时候,都会自动提升到int类型的
回复 使用道具 举报

x=x+b,x是int类型的,b是byte类型的会自动转换成int类型来跟x相加,在java中加法会自动转换成int类型,虽然x,b也是两个变量,如果x值很大也可能超出int取值范围出现强制转换,但是我们一般的运算用不到那么大的数据,int的取值范围在21亿多呢,2的32次方,所以一般不考虑int强制转换,
回复 使用道具 举报
x是int型的,相加之后的结果也是int型的,肯定不会报错的
回复 使用道具 举报
byte b1=3;byte b2=4;byte b3=b1+b2; b1 和b2 相加会自动转换成int类型,你将int类型的赋值给byte类型肯定会报错啊,byte b3=(byte)(b1+b2) 可以改成这样将int类型的值强转成byte类型,在赋值给byte类型,就没错了
回复 使用道具 举报
wksvo 发表于 2016-4-3 17:49
你没看懂我提问的意思,那我问你 b3=(byte)(b1+b2) 这个对不对,如果不对 为什么 ...

分两种情况;
1,b3,如果申明是byte类型,并且b1+b2的值在-128到127之间,就会是你想要的数.否则会通过
取反得到另一个值;
2 ,就是没申明b3类型,默认是int类型了,自动提升,输出你想要的值
回复 使用道具 举报
因为b1与b2是两个变化的值,程序在运行的时候不确定里面的取值,有可能超过byte的取值范围,
回复 使用道具 举报
byte b3=(byte)(b1+b2);是正确的,前提不能超过byte的范围吧
回复 使用道具 举报
表达没错,但是结果可能会错,所以最好不要这么用,视频里都有说的!
回复 使用道具 举报
规定的语法还可以认为是x+=b
回复 使用道具 举报
一个byte类型与int类型做运算会自动提升为int类型  结果也是一个int类型,用一个int类型来接收是不会有精度损失的
回复 使用道具 举报
因为x是int的型的数据,int型的数据加byte型的数据会自动转型!!
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马