我使用java将一个长整数y复制到一个短整数x:
long y = 40002;
short x = (short) y;
System.out.println("x now equals " + x);
结果是:x现在等于-25534。
我试图弄清楚40002是如何投入-25534的,但我失败了。 40002对应1001 1100 0100 0010,-25534对应1110 0011 1011 1110.任何朋友都可以告诉我这个过程中发生了什么?非常感谢!
答案 0 :(得分:9)
通过将long
转换为short
,您所做的是缩小基元转换,JLS, Section 5.1.3涵盖了
有符号整数到整数类型T的缩小转换只会丢弃除n个最低位之外的所有位,其中n是用于表示类型T的位数。除了可能丢失有关幅度的信息之外数值,这可能导致结果值的符号与输入值的符号不同。
long
值40002
是以下64位:
00000000 00000000 00000000 00000000 00000000 00000000 10011100 01000010
转换仅保留最低16位:
10011100 01000010
前导1
以2的补码表示法解释为-2 ^ 15,而不是+ 2 ^ 15。这就解释了为什么long
值和short
值之间存在2 ^ 16,65,536的差异。
答案 1 :(得分:4)
Integer overflow发生了。
short是两个带符号的字节,这意味着Short.MAX_VALUE
是2 15 -1,即32,767。 "放大"逻辑上的价值观"环绕"进入负面范围。
在这种情况下,过量的量是40,002-2 15 = 7234
Short.MIN_VALUE
是-2 15 = -32,768
-32,768 + 7234 = -25,534
这是您想知道的数字。
答案 2 :(得分:0)
谢谢你们所有人。根据你的所有答案,我总结如下: 长值40002是以下64位:
00000000 00000000 00000000 00000000 00000000 00000000 10011100 01000010
转换仅保留最低16位:
10011100 01000010
当JVM将10011100 01000010视为一个短整数时,它将按如下方式计算:
-2^15 + 00011100 01000010 = -32768 + 7234 = -25534
就是这样。
答案 3 :(得分:0)
基本上,它会循环显示值,当你达到最大值并加1时它将成为最低值,所以32768将是-32768,当你达到65536 (32768 * 2)它将变为0,当你达到98303(32768 * 2 + 32767)时它将是32767,如果你加一个你将会到达98304(32768) * 3)它将再次成为-32768。
因此转换为卖空时,40002(高于32768但低于32768 * 2)显然是负数。