【问题标题】:When a long integer is cast into a short one, what happened?当一个长整数被转换成一个短整数时,会发生什么?
【发布时间】:2015-01-16 21:11:54
【问题描述】:

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

【问题讨论】:

  • 2^16 - 40002 = 25534 :)

标签: java casting


【解决方案1】:

您通过将long 转换为short 所做的是缩小基元转换JLS, Section 5.1.3 涵盖了这一点:

有符号整数到整数类型 T 的窄化转换只会丢弃除 n 个最低位之外的所有位,其中 n 是用于表示类型 T 的位数。除了可能丢失有关数值,这可能会导致结果值的符号与输入值的符号不同。

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。

【讨论】:

  • 我喜欢这个作为我回答的补充。
  • @MattBall 我喜欢它而不是你的回答。你的描述了很多实际上并没有发生的减法和加法。这描述了实际发生的情况。
【解决方案2】:

Integer overflow 发生了。

short 是两个有符号字节,这意味着Short.MAX_VALUE 是 215-1,即 32,767。 “更大”的值在逻辑上“环绕”到负范围内。

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

这是你想知道的数字。

【讨论】:

  • 我明白了.. 40,002 - 32,767 = 7,235 + -32,768 = -25,533.. 不知道那额外的 1 去了哪里..
  • @Woodrow 是 40,002 - 32,768
【解决方案3】:

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

00000000 00000000 00000000 00000000 00000000 00000000 10011100 01000010

转换只保留最低16位:

10011100 01000010

当 JVM 将 10011100 01000010 视为一个短整数时,它会这样计算:

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

就是这样。

【讨论】:

    【解决方案4】:

    基本上,它将在值之间循环,当您达到最大值并加 1 时,它将成为最小值,因此 32768 将变为 -32768,当您达到 65536 (32768*2) 时,它将变为为 0,当你达到 98303 (32768*2+32767) 时,它将是 32767,如果你加一个,你将得到 98304 (32768*3),它又会是 -32768。

    所以 40002(高于 32768 但低于 32768*2)在转换为短时显然是一个负数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-24
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-05
      • 2018-06-09
      相关资源
      最近更新 更多