如何计算以下Java程序的输出?
class hello {
public static void main(String args[]){
short a=(byte)32767;
System.out.println(a);
}
}
Run Code Online (Sandbox Code Playgroud)
整数常量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).
| 归档时间: |
|
| 查看次数: |
445 次 |
| 最近记录: |