考虑以下代码:
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
归档时间: |
|
查看次数: |
7521 次 |
最近记录: |