黑马程序员技术交流社区

标题: “int x=3;byte b=4;x=x+b,”这是对的,那为什么“byte [打印本页]

作者: wksvo    时间: 2016-4-3 16:13
标题: “int x=3;byte b=4;x=x+b,”这是对的,那为什么“byte
“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为什么就是对的呢,求解

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

你没看懂我提问的意思,那我问你 b3=(byte)(b1+b2) 这个对不对,如果不对 为什么
作者: doglovely    时间: 2016-4-3 17:56
x+b制动提升为int类型了呀,x是int类型的,所以是对的呀
作者: wksvo    时间: 2016-4-3 18:00
doglovely 发表于 2016-4-3 17:56
x+b制动提升为int类型了呀,x是int类型的,所以是对的呀

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

这个 b3 = (byte)(b1 + b2) ;是对的,但是得到的b3的结果可能会出乎意料,即如果和的结果超出byte的取值范围就会得不到想要的结果。
作者: Max灬xu    时间: 2016-4-4 01:20
这个问题简单,我就直接给你解释左边那句x=x+b;byte要提升为int,也就是int+int;而两个int类型进行相加运算  java内部机制会默认int运算,一旦超出这个范围,他自动底层有强制转换过程,保留自己原有位置、高位全舍弃  这就是byte和int的区别,int属于默认类型,他就没有byte那样的问题

作者: Max灬xu    时间: 2016-4-4 01:25
补充: byte和short类型“变量”,相加不能确定结果,无法检查,也不是默认类型,所以byte、short类型相加的时候,都会自动提升到int类型的
作者: hailong154    时间: 2016-4-4 01:29

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

分两种情况;
1,b3,如果申明是byte类型,并且b1+b2的值在-128到127之间,就会是你想要的数.否则会通过
取反得到另一个值;
2 ,就是没申明b3类型,默认是int类型了,自动提升,输出你想要的值
作者: heimawyl1993    时间: 2016-4-4 22:17
因为b1与b2是两个变化的值,程序在运行的时候不确定里面的取值,有可能超过byte的取值范围,
作者: HeiMaZ    时间: 2016-4-4 23:48
byte b3=(byte)(b1+b2);是正确的,前提不能超过byte的范围吧
作者: zlf1991312    时间: 2016-4-5 15:30
表达没错,但是结果可能会错,所以最好不要这么用,视频里都有说的!
作者: fffsss    时间: 2016-4-5 22:26
规定的语法还可以认为是x+=b
作者: 2290237416    时间: 2016-4-5 23:00
一个byte类型与int类型做运算会自动提升为int类型  结果也是一个int类型,用一个int类型来接收是不会有精度损失的
作者: lhc19931210    时间: 2016-4-5 23:19
因为x是int的型的数据,int型的数据加byte型的数据会自动转型!!
作者: kuro    时间: 2016-4-6 21:51
java中int是默认的整数的类型,一般常用的数都能用int来表示。byte这个取值范围是-128-127,,很容易就超过范围。
作者: kuro    时间: 2016-4-6 21:53
java中int是默认的整数的类型,一般常用的数都能用int来表示。byte这个取值范围是-128-127,,很容易就超过范围。
作者: jyjiawohao    时间: 2016-4-7 14:39
x是int类型的,b是byte类型,
int类比byte类大,不会出现越界
但是byte类型 +int类型的变量就有可能出现错误。
byte b3=b1+b2;  有可能相加的数超过取值范围 byte的范围是 -128 到127
但是int类范围大不容易出现这个问题

但是可以强类型提升
byte b3=(byte)(b1+b2)
作者: 兵蜂    时间: 2016-4-8 23:35
byte char short 等类型无论是之间的相互运算还是和int类型进行行运算,都会自动提升为型然后再运算,因此所得结果为int类型. 然后赋值语句就涉及类型之间的转换了




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