如何计算以下Java程序的输出?
class hello {
public static void main(String args[]){
short a=(byte)32767;
System.out.println(a);
}
}
答案 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)。