黑马程序员技术交流社区

标题: 关于类型转换的一道题 [打印本页]

作者: 明月几时有    时间: 2013-11-18 13:11
标题: 关于类型转换的一道题
4、 以下代码哪个是正确的?为什么?
a. byte b = 1 + 1;                     
b. byte b = 1; b = b + 1;         
c. byte b = 1; b = b += 1;        
d. byte b = 1; b = ++b;
关于这样的题,记得老师以前说 会损失精度,强转,自动类型提升,常量优化机制,,等等原因
可这四个都分别该怎么解释呢           
作者: ╰ゝ冷筱柔    时间: 2013-11-18 15:26
这是基础测试题,我做过。A正确
B选择中的b是byte型 b+1中的1是整形,所以想家会损失精度。
C 是把b+1的值付b 跟B选项类似
D是++b           [byte] b = [byte] b+ [byte] 1  应该是这种形式 需要强制转换

作者: ixiangfeng    时间: 2013-11-18 15:39
╰ゝ冷筱柔 发表于 2013-11-18 15:26
这是基础测试题,我做过。A正确
B选择中的b是byte型 b+1中的1是整形,所以想家会损失精度。
C 是把b+1的值 ...

呃 只有B是错误的 小心误导楼主了
作者: bpsend    时间: 2013-11-18 15:41
a. byte b = 1 + 1;                 //正确,常量优化机制:编译器会把 byte b = 1 + 1编译成 byte b = 2;只要不超过-128至正的127就可以通过。
b. byte b = 1; b = b + 1;      //编译错误,损失精度。byte、char、short的变量会转换为Int类型进行运算,得出的结果也是Int。int类型的赋值给byte类型的会损失精度。
c. byte b = 1; b = b += 1;   //正确,+=赋值运算符隐含了一个强制转换,他会将结果转换为你接收的类型。
d. byte b = 1; b = ++b;    //正确,这个是c和a的组合体

byte b = 1;b=++b 等于 byte b = 1;b= b+=1; 等于 byte b2 = 1; b2=(byte)(b2+1);


作者: ixiangfeng    时间: 2013-11-18 15:47
A:1+1在编译时就能确定,而且在byte范围内 正确
B:b = b + 1;  b+1会自动提升为int类型 然后赋值给b,因为b是byte类型的,错误
C:b = b+=1;先进行b+=1,因为+=是java语言规定的运算符,java编译器会对它进行特殊处理,运行后还是原来的类型,赋值给b也正确,不用强转,正确
D:++和+=符号一样,正确
作者: ╰ゝ冷筱柔    时间: 2013-11-18 16:00
误导楼主了,sorry,重新解释一下C选项。对于第一个运算,首先,byte b = 1;实际上这个值是编译器先进行了一次检查,范围在byte范围内,则编译通过,  
同时将1这个int类型的值在底层转化为了byte类型赋给了b;  
再说说b = b += 1;这个运算是将b += 1的计算结果赋给了b,所以我们只说b += 1的运算过程就行了,  
b += 1,其实等价于 b = (byte)(b+1);底层会对这个结果进行强转的,所以它编译的时候没事,如果b是127,  
那么加1后变成128了,成了int类型了,超过了byte类型的最大范围了,怎么办?这时候底层会强转,把int类型的  
前面三个高位丢弃,丢弃后,如果剩下的一位中,最高位为1,则取反加一,就成了负数了,如果最高位为0,直接把    值赋给b  

作者: ╰ゝ冷筱柔    时间: 2013-11-18 16:01
在说D选项。
b = ++b,这个运算的过程是,先进行++b的运算,再把运算后的结果赋给b,++b计算后是一个int类型的,  
不管结果等于多少,底层会进行一个强转,也就是说++b就相当于 b = (byte)(b+1),所以这个编译也没有问题,
作者: 明月几时有    时间: 2013-11-19 00:18
感谢各位细心回答,我知道对错,就是不知道怎么说
作者: 黄炳期    时间: 2013-11-19 12:28
帖子已重新分类




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