黑马程序员技术交流社区
标题:
关于变量强制类型转换的问题
[打印本页]
作者:
张昊镭
时间:
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
class Demo
{
public static void main(String[] args)
{
byte b1=3, b2=4, b;
//b=(byte)(b1+b2);正确
b=b1+b2;
/*出现错误:可能损失精度。
因为b1和b2都是byte型但是经过计算以后会提升为int型。
如果不进行强制转换会出错。*/
System.out.println(b);
b=3+4;
/*没有出错。因为这句话你也可以看成是:b=7;
系统会自动将计算的7,强转成byte型。*/
System.out.println(b);
}
}
复制代码
作者:
王睿
时间:
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