4

我有三个短变量。当我将两个加在一起并将结果分配给第三个时,eclipse 告诉我需要将其转换为 short !

short sFirst, sSecond, sThird;

sFirst = 10;
sSecond = 20;
sThird = sFirst + sSecond;

然而,当我做一个简单的分配,然后是一个增量分配时,一切都很好。

short sFirst, sSecond, sThird;

sFirst = 10;
sSecond = 20;
sThird = sFirst;
sThird += sSecond;

为什么是这样 ?

4

2 回答 2

9

JLS(§15.8.2)这样说:

“二进制 + 运算符在应用于两个数字类型的操作数时执行加法,产生操作数的总和。”

“在操作数上执行二进制数字提升(§5.6.2)。”

这意味着您的表达式的操作数将转换为int. 所以加法会将一个添加int到一个int.

“数字操作数上的加法表达式的类型是其操作数的提升类型。”

在你的情况下,int.


我不会推测为什么会这样。然而,这并非偶然。如果您查看 JVM 规范中定义的字节码指令集,您会看到有用于 、 和 ... 的算术指令int,但long没有用于较小整数类型的算术指令。floatdouble

于 2013-08-07T10:26:25.840 回答
2

Java 语言规范中精确地指定了这种行为。

为什么如此指定的问题的答案只是猜测,而不是真正的答案。我的“有根据的猜测”得到了 Oli Charlesworth 的支持,因为等效语义适用于 C 和其他类似语言。C 中的语义就是这样的(再次是“有根据的猜测”),因为它们允许编译器生成最优化的代码。

于 2013-08-07T10:20:50.787 回答