首先我知道Java在涉及到byte,short和char的运算时会把这些值转换为int类型,然后对int类型值进行运算,最后得到int类型结果。。
那么问题来了,下面是我在书上看到的面试题,我想知道为什么不是两个答案都错×而只是B。。求各路大神帮忙解答
因为int表示的范围比short大,所以任何short转换成int都没事,反过来,int转short就可能出错。
所以前者可以自动转换,后者需要程序员强制转换,java这么设计是为了防呆。就好比usb插头,反过来差不进去一样的道理。
除了楼上的回答以外,楼主还可以去查一下s=s+1;s+=1;s=s++,这三者在数据类型相同的情况下,运算完全没有问题,但是数据类型不一样的情况下,jvm虚拟机是怎么处理的,你可以去了解一下
A答案应该是错误的
解析如下:
s=s+1中,s+1运算的结果是int型,把它赋值给一个short型的变量s,所以会报错
B答案应该是正确的
解析如下:
s+=1中,由于s是short类型的,所以1首先被强制转换为short型,然后再参与运算,并且结果也是short型的,所以不会报错。
综上所述,这道面试题的答案应该写错了。
A是将s+1赋给s S本身是short类型,而1是int整形,整形(5)和short(2)字节不一样导致失去精度
B是运算符,这里讲到=和+=的不同,在开发中=就是赋值的意思,而+=是运算符,虽然在相同类型下结果是相同的,但意义不同
向上转型和向下转型 你去了解一下
short s = 1, s += 1; 有一个隐式类型转换: short s = 1, s = (short)(s + 1)
明显答案错了 byte short int 只能从小范围转到大范围,逆转必须强制转换。这条道题的本质在于 s=s+1 与 s+=1的区别,1默认是int显然s=(short)(s+1)才对,故A错。而在后面s+=1的时候他的原理是s=s+1是把后面s+1的值赋值给前面的s,而赋值之前s+1属于计算机内部运算直接提升,并非先算s+1,而是直接属于把s+1的值赋值给s,在解析时s+=1就等价于s = (short)(s+1),翻番来讲就是 s+=1 s = (s的类型)(s+1)
s=s+1运算时是short+int结果是一个int不能直接赋值给一个short类型的引用,而s+=1指的是s每次自增1,运算时不涉及到数据类型转换。