【问题标题】:Java - Explicit Conversion from Int to ShortJava - 从 Int 到 Short 的显式转换
【发布时间】:2013-09-22 12:56:15
【问题描述】:

有人能解释一下为什么下面的说法吗:

short value = (short) 100000000;
System.out.println(value);

给我:

-7936

知道Java中short的最大值是32767正确吗?

【问题讨论】:

  • 当我运行相同的代码时得到-7936
  • 对不起,应该是1000000

标签: java variables casting int short


【解决方案1】:

Here's 很好的文章,解释了 Java 中的缩小和扩大原始转换。

short s = 696; // 0000 0010 1011 1000
byte x = (byte)s;
System.out.println("byte x = " + x);

生产:

byte x = -72

现在你应该明白为什么了 - 因为当我们缩小到 JVM 丢弃最重要部分 (00000010) 的字节和 结果(二进制形式)是 10111000。这与我们的数字相同 看着之前。而且,正如你所看到的,它是负数,不像 原值。

【讨论】:

    【解决方案2】:

    您这样做的方式只是重新解释了同一内存位置的少量位。它不会改变它们。

    您可能希望使用maxmin 函数来检测值何时超出short,并在发生这种情况时分配短路的最大值或最小值。

    int n = 1000000;
    short value = n > Short.MAX_VALUE ? Short.MAX_VALUE : n < Short.MIN_VALUE ? Short.MIN_VALUE : (short)n;
    

    更新:更简洁:

    import static java.lang.Math.max;
    import static java.lang.Math.min;
    
    // ...
    
    value = (short)min(max(value, Short.MIN_VALUE), Short.MAX_VALUE);
    System.out.println(value);
    

    【讨论】:

    • @AppXene “它只是重新解释从同一内存位置开始的少量位”
    • 请删除这个它不能回答问题 - 你会得到你的代表回来
    • @Mr_and_Mrs_D 看起来我找回了我的代表,然后还有更多:D
    【解决方案3】:

    你的价值是 1 亿,我得到 -7936。 1亿变成100万只能得到16960。

    原因是 short 的值被限制在 -32768 到 +32767 之间,而 Java 在转换为 shortnarrowing primitive conversion, JLS 5.1.3)时只保留最低有效 16 位。这个操作实际上是:100 万模 2^16(short 中的 16 位)是 16960。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-05
      • 2013-09-03
      • 2015-05-18
      • 2012-07-11
      • 1970-01-01
      • 2013-01-19
      相关资源
      最近更新 更多