下面的这段代码为什么会报错
第五行显示报错
这里我理解不了为什么会显示溢出
第五行在进行运算的时候右边的a和b同时提升为int数据类型,那么最终第五行右边得到的结果因该是一个为13的int的数据类型。但是右边转化为int数据类型之后并没有超过左边的数据类型范围,编译器不应该自动帮我进行强制转换吗?
假如是short result = 13;
的话,右边是int类型,没写short进行强制转换,但是没有报错。
你这是两个不同的操作
short result = 13;
单纯赋值操作,数值是已经确定的,就是13,没有超过short范围,可以自动向下转型
short result = a + b;
这是个运算,而且a
和b
都是变量,最终结果到底是多少不确定,可能会超出short范围,所以编译器不会进行自动转型操作
你需要知道,编译器只管编译,虽然会对代码进行一定优化,
类似 short result = 5 + 8;
这样的完全确定的运算才会进行优化,
但是带变量的这种数据运算显然并不是它的工作。
赋值操作是在运行时才会进行的,也就是说a
和b
的值需要到运行时才会确定下来,编译的时候就是个没有值的符号。
你自己说了第5行右边的运算结果为int类型的13,高精度转低精度则必须自己使用使用强转, 当然你也可以使用a+=b; +=会匹配类型
a+b运算的时候,会自动提升为int类型进行运算,结果也就是int,需要(short)(a+b),进行类型强制转换
数据类型为short,byte的数值,在运算的时候,都会转换为Int类型再运行的,所以左边是short类型来接受一个Int类型会报错的,可以将后面的数据强转成short类型,或者
将第五行改为: short result = 0; result += (a+b);