基于以下信息,
我们知道Java的short
范围从-32768 (=0x8000)
到32767 (=0x7FFF)
,而且投射是可选的。我不明白的是,为什么我们必须明确地将0x8000
投放到short
?
public static void main(String[] args)
{
short x;
x = (short) 0x8000;
// x = 0x8000; // have to cast 0x8000 to short
System.out.println(x);
}
我在Windows上使用NetBeans。
答案 0 :(得分:4)
0x8000
解释为值为32768
的整数,然后Java尝试将其转换为short,然后无法执行此操作,因为32768
没有'适合做空。
请注意,仅使用32768
也会产生相同的结果:
short x = (short)32768;
System.out.println(x); // -32768
作为另一个例子,请考虑以下代码行:
short x = 0xffff8000;
System.out.println(x); // -32768
此处不需要强制转换,因为0xffff8000
是整数-32768
,并且适合简短。
但是不要问我为什么他们决定让事情以这种方式工作(这可能只是为了让编译器保持简单)。
我在JLS中找到的唯一适用的摘录来自5.2. Assignment Contexts :( 3.10.1. Integer Literals也相关)(但我当然错过了相关部分)
此外,如果表达式是byte,short,char或int类型的常量表达式(第15.28节):
- 如果变量的类型是byte,short或char,则可以使用缩小的原语转换,并且常量表达式的值可以在变量的类型中表示
虽然这样做,但在我看来,这里有一些关于预期行为的含糊不清。
答案 1 :(得分:2)
您忘记添加标记:正值[{1}}对于0x8000
而言太大,short
应该有效。