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

mic*_*bit 5 java casting

我使用java将一个长整数y复制到一个短整数x:

long y = 40002;
short x = (short) y;
System.out.println("x now equals " + x);
Run Code Online (Sandbox Code Playgroud)

结果是:x现在等于-25534.

我试图弄清楚40002是如何投入-25534的,但我失败了.40002对应1001 1100 0100 0010,-25534对应1110 0011 1011 1110.任何朋友都可以告诉我这个过程中发生了什么?非常感谢!

rge*_*man 9

通过将a 转换为a 所做longshort是一个缩小的原始转换,这由JLS第5.1.3节涵盖:

将有符号整数缩小到整数类型T只会丢弃除n个最低位之外的所有位,其中n是用于表示类型T的位数.除了可能丢失有关数值大小的信息之外,这可能导致结果值的符号与输入值的符号不同.

long值为40002以下64位:

00000000 00000000 00000000 00000000 00000000 00000000 10011100 01000010
Run Code Online (Sandbox Code Playgroud)

转换仅保留最低16位:

10011100 01000010
Run Code Online (Sandbox Code Playgroud)

该前导1以2的补码表示法解释为-2 ^ 15,而不是+ 2 ^ 15.这就解释了为什么long价值和short价值存在2 ^ 16,65,536的差异.

  • @MattBall我喜欢它*而不是*你的答案.你的人描述了许多实际上没有发生的减法和补充.这描述了实际发生的事情. (4认同)