短整型加短整型等于整型。

4

我有三个short变量。 当我将其中两个相加并将结果赋值给第三个时,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;

为什么会这样呢?
2个回答

9

JLS (§15.8.2)指出:

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

“操作数将执行二进制数值提升(§5.6.2)。"

这意味着您表达式的操作数被转换为int。 因此,加法将添加一个int到一个int

“对数值操作数进行加法运算的类型是其操作数的提升类型。”

在您的情况下,是int


我不会猜测为什么要这样做。但这并非偶然。如果您查看JVM规范中定义的字节码指令集,您会发现有针对intlongfloatdouble的算术指令...但没有针对较小整数类型的指令。

谢谢Stephen。作为一个有20多年C/C++背景的人,这种限制似乎是一种异常情况,应该由编译器而不是程序员来处理。 - Simon

2
这种行为在Java语言规范中被明确定义。
至于为什么这样指定的答案只是猜测,而不是真正的答案。我的“有根据的猜测”,得到Oli Charlesworth的支持,是因为等效的语义适用于C和其他类似的语言。而C中的语义(再次是“有根据的猜测”)是这样的,因为它们允许编译器产生最优化的代码。

“为什么”有一个非常合理的答案,那就是“因为它回响了其他类C语言的语义”。 - Oliver Charlesworth
@OliCharlesworth 我猜这是因为它给编译器提供了最大的自由度来生成优化的代码(当然,我不是指javac)。 - Marko Topolnik
然而,在C或C++中,您永远不需要将两个short的加法强制转换为short。 - Simon
1
@Simon 你的意思是显式转换。那只是一种语法上的技巧,这是因为Java有“保护程序员免受自己错误影响”的态度。 - Marko Topolnik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接