从int缩小到短

Ank*_*gam 0 java

我正在缩小范围并检查以下代码: -

int i = 131072;
short s = (short)i;
System.out.println(s); //giving 0
Run Code Online (Sandbox Code Playgroud)

这种缩小正在输出0.我无法理解背后的逻辑.

Era*_*ran 8

131072int是00000000 00000010 00000000 00000000二进制的.

当你考虑它时short,只剩下最低的16位 - 00000000 00000000.


Pet*_*rey 7

将基元转换为较小的基元时,顶部位被删除.

写另一种方式,你可以看到发生了什么.

int i = 0x20000;
short s = (short) (i & 0xFFFF);
Run Code Online (Sandbox Code Playgroud)

注意:整数的低16位都是零,所以答案是0.

二进制转换为(short)仅保留低16位.

00000000 00000010 (00000000 00000000)
Run Code Online (Sandbox Code Playgroud)

如果要输出更长的数字,在每种情况下仍然需要较低的位数.注意:&在每种情况下都是多余的,只是为了清晰起见.

long l = 0x0FEDCBA987654321L;

// i = 0x87654321
int i = (int) (l & 0xFFFFFFFFL);

// c = \u4321
char c = (char) (l & 0xFFFF);

// s = 0x4321
short s = (short) (l & 0xFFFF);

// b = 0x21
byte b = (byte) (l & 0xFF);
Run Code Online (Sandbox Code Playgroud)