为什么`short a =(byte)32767`变为-1?

时间:2014-03-13 15:39:08

标签: java

如何计算以下Java程序的输出?

class hello {
    public static void main(String args[]){ 
        short a=(byte)32767;
        System.out.println(a);      
    }
}

1 个答案:

答案 0 :(得分:7)

整数常量32767是十六进制,0x00007FFF。

byte是带符号的8位类型。转换(byte)0x00007FFF有效地截断高24位,留下0xFF。

由于它已签名,因此代表-1。将其分配回short不会更改该值,因为它已经转换为byte,并且-1在short的范围内。评估基本上是:

short a = (byte)32767;
short a = (byte)0x00007FFF;
short a = (byte)0xFF (= (byte)(0x00007FFF & 0x000000FF));
short a = -1;

或者,二进制,如果你愿意(因为其他人已经提到它):

      32767 = 00000000 00000000 01111111 11111111 (type is int)
(byte)32767 = ^-- these are dropped. --^ 11111111 (type is byte)
to short    =                   11111111 11111111 (value is signed [-1], sign extends)

记住byte已签名非常重要,因此在扩展为short时会保留签名的值。如果byte未签名(范围0-255),那么该值将为255,结果short将为00000000 11111111(255)。