Java的短跨度来自-32768(= 0x8000),但为什么我们必须明确地将0x8000强制转换为短路?

时间:2018-03-17 17:56:37

标签: java

基于以下信息,

enter image description here

enter image description here

我们知道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。

2 个答案:

答案 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应该有效。