为什么Java中短整数除法的结果类型不是一个短整数?

flo*_*din 12 java syntax

考虑以下代码:

public class ShortDivision {
    public static void main(String[] args) {
        short i = 2;
        short j = 1;
        short k = i/j;
    }
}
Run Code Online (Sandbox Code Playgroud)

编译它会产生错误

ShortDivision.java:5: possible loss of precision
found   : int
required: short
        short k = i/j;
Run Code Online (Sandbox Code Playgroud)

因为表达式i/j的类型显然是int,因此必须强制转换为short.

为什么类型i/j不短?

mob*_*mob 19

Java规范:

5.6.2二进制数字促销

当运算符将二进制数字提升应用于一对操作数时,每个操作数必须表示数值类型的值,以下规则按顺序应用,使用扩展转换(第5.1.2节)根据需要转换操作数:

如果任一操作数的类型为double,则另一个操作数转换为double.

否则,如果任一操作数的类型为float,则另一个操作数转换为float.

否则,如果任一操作数的类型为long,则另一个操作数转换为long.

否则,两个操作数都将转换为int类型.

对于二进制操作,将提升小整数类型,int并且操作的结果为int.


编辑:为什么会这样?简短的回答是Java从C复制了这种行为.更长的答案可能与所有现代机器至少进行32位本机计算这一事实有关,而且某些机器实际上可能更难做8位和16位操作.

另请参见:C#中的OR-ing字节给出了int