黑马程序员技术交流社区

标题: 关于变量强制类型转换的问题 [打印本页]

作者: 张昊镭    时间: 2012-3-10 08:47
标题: 关于变量强制类型转换的问题
这个问题一直没想通:

byte b1=3,b2=4,b;
b=b1+b2;
System.out.println(b);
b=3+4;
System.out.println(b);


结果是b=b1+b2提示损失精度,b= 3+4打印出7.

我在想第一句定义三个变量,都是byte型,既然b1,b2,b都是byte,那怎么第二句提示可能损失精度?
                b=b1+b2;
                    ^
  需要: byte
  找到:    int
我把第二句改成b=(byte)(b1+b2);就能通过了,那就是说b1和b2还是int,它们的和也是int,但b是byte,需要在和前面加强制转换,是这样理解吗?
第二天的视频里面讲定义变量的时候说long和float定义初始值后面要加标识,比如long x = 4l;float y=3.5f;因为默认类型分别是int和double,那么说byte在定义初始值的时候也要在后面加标识?不然就会出现像第二句那样编译失败?那么加什么标识呢?


b=3+4;打印出来是7,既然第二句编译失败,说明b是byte,3和4都是int,其结果也是int,怎么能赋值给b?

作者: 冯旭君    时间: 2012-3-10 09:00
byte类型的变量在计算是会自动转换成int进行运算,b=b1+b2;在给b赋值是,b1 + b2 当然是已经被默认的转换成int型了,必须强制转换类型。因为所有的向下转换,或者是向“小的类型”转换都必须强制转换。在定义byte类型时不需要加修饰的。3和4并不是int型,3和4就是一个常数,什么类型是变量专有的说法。
作者: 叶绍亮    时间: 2012-3-10 09:19
本帖最后由 yeshaoliang 于 2012-3-10 09:40 编辑

第一句定义三个变量,都是byte型,既然b1,b2,b都是byte,
这句有误,应该是b1是byte型。b2你没有定义它为byte型,显然是int型。
执行b=(byte)(b1+b2);这句时原先b1是byte型,而b2为int.根据类型自动提升,b1就提升为int型了,因而结果就为int型。在前面加个byte,就是进行强制类型转换了,


b=3+4;打印出来是7,这个结果跟第二句没关系吧,不能说明b是byte,根据你第一句的定义就单单定义b1为byte,而3和4都是默认的int,


作者: 王国华    时间: 2012-3-10 09:33
b1和b2都是byte型 b1+b2运算的的结果自动升级为int型,所以要强转

作者: 王杰    时间: 2012-3-10 10:29
  1. class Demo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 byte b1=3, b2=4, b;
  6.                 //b=(byte)(b1+b2);正确
  7.                 b=b1+b2;
  8.                 /*出现错误:可能损失精度。
  9.                 因为b1和b2都是byte型但是经过计算以后会提升为int型。
  10.                 如果不进行强制转换会出错。*/
  11.                 System.out.println(b);
  12.                 b=3+4;
  13.                 /*没有出错。因为这句话你也可以看成是:b=7;
  14.                 系统会自动将计算的7,强转成byte型。*/
  15.                 System.out.println(b);
  16.         }
  17. }
复制代码

作者: 王睿    时间: 2012-3-10 10:43
在运算中b1 和 b2 自动提成成了int型,而 b=3+4 ,中只要右面的值没有超过byte的取值范围就没事,   b=124+4,这样就不行了。
变量类型是用来控制变量的取值范围的,3和4就是个数字,类型应该是小数啊,分数啊什么的,不是int,byte这个体系的。




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