黑马程序员技术交流社区

标题: 关于自动类型转换的问题 [打印本页]

作者: kellyzyb    时间: 2013-10-10 16:21
标题: 关于自动类型转换的问题
本帖最后由 kellyzyb 于 2013-10-10 16:47 编辑
  1.                 byte b1=3,b2=4,b;
  2.         
  3.                 b=(byte) (b1+b2);
  4.                
  5.                 b=7+8;
复制代码
我个人理解:b=(byte) (b1+b2); 当b1和b2参与运算时会自动提升到int型,当运算结果给到b里,需要强转成byte型。
但下面b=7+8;也能编译通过就理解不了。7和8 应该是int型啊,运算完的结果也应该是int型.int型赋给byte型不是会损失精度吗?难道这里b 变成了int 型?
作者: 喝龙血的我    时间: 2013-10-10 16:27
本帖最后由 喝龙血的我 于 2013-10-10 16:31 编辑

因为java中最小的运算空间为int,就算是两个byte型做运算,结果仍是int型,byte运算实际上是int运算后的结果赋值给byte

作者: kellyzyb    时间: 2013-10-10 16:30
喝龙血的我 发表于 2013-10-10 16:27
因为java中最小的运算空间为int,就算是两个byte型做运算,结果仍是int型

我的问题是,b应该是byte型,而7和8是int 型 15这个结果也应该是int型,int型赋给byte型,应该是编译不通过,损失精度。问题是没有报错。b什么时候变成int型了
作者: 王建亮    时间: 2013-10-10 16:31
这是赋值的特殊机制 当给b赋值的时候,只要赋值语句里是常量,而且不超过byte的最大值,是允许的
作者: 喝龙血的我    时间: 2013-10-10 16:33
本帖最后由 喝龙血的我 于 2013-10-10 16:34 编辑

参照  byte a1=3;
你的运算结果可以看做  byte b=15;没什么问题啊,只要不超出byte范围就行
作者: FFF    时间: 2013-10-10 16:37
本帖最后由 FFF 于 2013-10-10 16:39 编辑

这个问题很简单,给你分享一下题目你就懂了。
题目如下:
  1. package com.itheima;

  2. public class Temp10_10{
  3. /**
  4. * 以下代码哪个是正确的?为什么?
  5. *a. byte b = 1 + 1;     
  6. *b. byte b = 1; b = b + 1;
  7. *c. byte b = 1; b = b += 1;   
  8. *d. byte b = 1; b = ++b;  
  9. *
  10. *@FFF
  11. */
  12.         public static void main(String arge[]){
  13.       
  14.          //编译通过。等价于byte = 2;因为右边是常量,其值固定,
  15.          //若在byte型的范围内,编译器会自动完成强制转换;若不在范围内,
  16.          //则编译失败。
  17.     byte b = 1 + 1;
  18.    
  19.     //编译失败。b是变量,编译器编译时并不会知道b具体是多少
  20.     //(编译时不会赋值,所以不知道b是多少),所以会认为b是所有可能的值,
  21.     //因此b+1不能通过编译。正确为: b = (byte) (b + 1);
  22.     byte b = 1;
  23.     b= b + 1;
  24.    
  25.     //编译通过。+=是一个赋值运算符,加和赋值是一步完成的,
  26.     //含有强制类型转换。等价于b = b = (byte)(b+1);
  27.     byte b = 1;
  28.     b = b += 1;
  29.    
  30.     //编译通过。++是自增运算符,自身加1再赋值给自己,
  31.     //加1和赋值也是一步完成的,且不会改变变量的类型(含有强制类型转换)。   
  32.     byte b = 1;
  33.     b = ++b;
  34.         }
  35. }
复制代码

作者: kellyzyb    时间: 2013-10-10 16:41
谢谢楼上两位,我想起来了,byte 是-128-127之间,只要没有超过范围就不会报错,超过128就会报损失精度了。
作者: 阿里策    时间: 2013-10-10 16:45
byte ---> int --->long ---> float ---> double优先级逐级升高,按照这个顺序类型转换是不需要强制转换的,所以这一题 b = 7+8;就将byte型的b自动转换成了int型。当优先级别高类型向低类型转换时需要强制转换(上图箭头反过来就需要强制转换)。还有像byte(8位)、short(16位)、char这种同级别的,相互之间也需要强制转换。
作者: 张宏祚    时间: 2013-10-10 16:49
这个很简单,b = 7 + 8 可以执行是因为15没有超出byte类型的范围,但是当你写:b = b1 + b2的时候,因为b1和b2都是变量,Java虚拟机不能确定保证变量相加之后仍然没有超出byte的范围,例如,b1 = 127,b2 = 127的时候,所以为了避免这种错误,所以不能写成 b = b1 + b2 ;
作者: kellyzyb    时间: 2013-10-10 16:50
FFF 发表于 2013-10-10 16:37
这个问题很简单,给你分享一下题目你就懂了。
题目如下:

不错,应该是这样




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