解释:
b = b+5在参与运算的时候,首先会自动转换成int类型。
在这个时候,b+5其实都被提升了类型。
所以,他们的计算结果也应该是int类型。
最终,就相当于直接把int类型赋值给byte类型,所以,会有精度的损失。
如果参与运算的是常量,编译器会先计算值,在看该值是否是左边能够表示的范围。
如果是,就不报错。l作者: @翱翔@ 时间: 2014-1-3 22:34
class Demo
{
public static void main(String[] args){
int x = 4;
x = x +4;//这是两个int类型的数相加 ,因为x是你定义的int类型,而4在运算中会自动转换成int类型;所以不会报错
byte b = 5;
b = b+5;//这个b是byte类型而5在运算中会自动转换成int所以会报错//隐式转换(从小到大) //在运算中byte,short,char会自动转换成 int long ,float 会自动转换成 double
}
}
作者: Class_焱 时间: 2014-1-3 22:34
正解:b =(byte)(b+5) 解释 :强制转换作者: 其LovE斤 时间: 2014-1-3 22:44
你是我今天碰到的第三个这个问题了。
建议去看一下 李若亮 老师的12月14号哪天的公开课视频。
int x = 4;
x = x +4;
JVM(编译器)看到整数,它就默认它是int型的。你这里x是int 4是int 肯定没问题
byte b = 5; (注意,这里5是常量)
先说这个。JVM在进行定义的变量初始化时,首先检测右侧的常量的数据自身的数据类型,与左侧的数据类型之间是否存在有可转化的可能性,这里 int 和 byte 有转换的可能性。然后检测右侧的数据是不是在左侧类型的范围内。byte是(-128~127),这里5在范围内。如果在范围内,自动将左侧的数据转型成左侧的类型
b = b+5;(这里b是变量)
b在这里是变量,是byte类型的变量,1是int型的。编译器将b提升为int型的。然后和1相加 (b+5)
但是“=”右边是变量的情况下,变量代表的是一片内存空间,无法判断是否在byte
范围内。int在内存中占4个字节,byte是占1个字节,左边放不下,错误,报的是 数据精度丢失。