我使用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.任何朋友都可以告诉我这个过程中发生了什么?非常感谢!
通过将a 转换为a 所做long的short是一个缩小的原始转换,这由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的差异.
| 归档时间: |
|
| 查看次数: |
2199 次 |
| 最近记录: |