我正在缩小并检查以下代码: -
int i = 131072;
short s = (short)i;
System.out.println(s); //giving 0
此缩小正在输出0
。我无法理解背后的逻辑。
答案 0 :(得分:8)
131072
int是二进制的00000000 00000010 00000000 00000000
。
当您将其设为short
时,只保留最低16位 - 00000000 00000000
。
答案 1 :(得分:7)
当您将基元转换为较小的基元时,顶部位将被丢弃。
写另一种方式,你可以看到发生了什么。
int i = 0x20000;
short s = (short) (i & 0xFFFF);
注意:整数的低16位都是零,所以答案是0。
二进制转换为(short)仅保留低16位。
00000000 00000010 (00000000 00000000)
如果要输出更长的数字,在每种情况下仍然需要较低的位数。注意:&
在每种情况下都是多余的,只是为了清晰起见。
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);
答案 2 :(得分:0)
原始值(int
,short
,...)存储为二进制值。 int
使用的位数多于short
。当你尝试向下转换时,你会切掉那些截断(并可能破坏)值的位。
答案 3 :(得分:0)
这不是向下转换(指向对象),它是缩小的转换或截断。当您执行此类演员表时,您只需将int
的两个最低有效字节复制到short
。如果整数小于2 15 你只是忽略包含零的字节,那么它就可以正常工作。
然而,情况并非如此。如果您检查131072
的二进制表示,您会看到100000000000000000
。因此,两个最低有效字节显然是0
,这正是您所获得的。