4

我有这样的代码

short a = 1;
short b = 2 ;
short c = a + b; // dosen't compile

编译失败的原因是什么?x+x总是产生Integer更大 Number,但为什么呢?

4

1 回答 1

20

二元运算符都不会产生Integer. 但是,它将使用一个int而不是较短的类型,byte并且short如果char 编译器可以内联该值,它可以为您转换该值。例如

final short a = 1;
final short b = 2;
short c = a + b; // does compile, because of constant inlining.

唯一产生 an 的运算符Integer是强制转换。

Integer i = (Integer) 1;

顺便说一句:奇怪的是,Java 将 32 位定义float为比 64 位long值“更宽”。这样做的缺点是浮点数的精度要低得多。考虑一下。

long l = 7777777777777777777L;
l += 0.0f;
System.out.println(l);

印刷

7777777579364188160

即使添加了 0.0F,l它也被隐式转换为float(因为 float 更宽),然后再转换回(因为使用了运算符分配),导致大约 200 亿的错误。

于 2014-01-17T12:42:56.323 回答