当一个长整数被转换成一个短整数时,发生了什么?

When a long integer is cast into a short one, what happened?

我用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,有朋友能告诉我这个过程中发生了什么吗?非常感谢!

Integer overflow 发生了。

一个short是两个有符号字节,也就是说Short.MAX_VALUE是215-1,也就是32767。 "Larger" 值在逻辑上 "wrap around" 进入负值范围。

在这种情况下,超出的金额为 40,002 - 215 = 7234
Short.MIN_VALUE 是 -215 = -32,768
-32,768 + 7234 = -25,534

你想知道的是哪个数字。

您将 long 转换为 short 所做的是 缩小原始转换 JLS, Section 5.1.3 :

A narrowing conversion of a signed integer to an integral type T simply discards all but the n lowest order bits, where n is the number of bits used to represent type T. In addition to a possible loss of information about the magnitude of the numeric value, this may cause the sign of the resulting value to differ from the sign of the input value.

long40002是以下64位:

00000000 00000000 00000000 00000000 00000000 00000000 10011100 01000010

转换仅保留最低有效 16 位:

10011100 01000010

前导 1 在 2 的补码表示法中被解释为 -2^15,而不是 +2^15。这就解释了为什么 long 值和 short 值相差 2^16,即 65,536。

谢谢大家。根据大家的回答,我总结如下: long值40002是以下64位:

00000000 00000000 00000000 00000000 00000000 00000000 10011100 01000010

转换仅保留最低有效 16 位:

10011100 01000010

当JVM把10011100 01000010看成一个短整数时,会这样计算:

-2^15 + 00011100 01000010 = -32768 + 7234 = -25534

就是这个。

基本上,它会循环遍历这些值,当您达到最大值并加 1 时,它将成为最低值,因此 32768 将是 -32768,当您达到 65536 (32768*2) 时,它是将是 0,当你达到 98303 (32768*2+32767) 它将是 32767,如果你添加一个你将得到 98304 (32768*3) 并且它将再次是-32768.

所以40002(高于32768但低于32768*2)换空后显然是负数