从int缩小到

时间:2015-07-30 14:19:58

标签: java

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

int i = 131072;
short s = (short)i;
System.out.println(s); //giving 0

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

4 个答案:

答案 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)

原始值(intshort,...)存储为二进制值。 int使用的位数多于short。当你尝试向下转换时,你会切掉那些截断(并可能破坏)值的位。

答案 3 :(得分:0)

这不是向下转换(指向对象),它是缩小的转换或截断。当您执行此类演员表时,您只需将int的两个最低有效字节复制到short。如果整数小于2 15 你只是忽略包含零的字节,那么它就可以正常工作。

然而,情况并非如此。如果您检查131072的二进制表示,您会看到100000000000000000。因此,两个最低有效字节显然是0,这正是您所获得的。