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

Ami*_*wal 2 java

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

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

Jas*_*n C 7

整数常量32767是十六进制的0x00007FFF.

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

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

short a = (byte)32767;
short a = (byte)0x00007FFF;
short a = (byte)0xFF (= (byte)(0x00007FFF & 0x000000FF));
short a = -1;
Run Code Online (Sandbox Code Playgroud)

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

      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)
Run Code Online (Sandbox Code Playgroud)

记住byte签名是很重要的,因此在扩展到a时会保留签名short.如果byte是无符号的(范围0-255),那么该值将是255,结果short将是00000000 11111111(255).