Java - 从Int到Short的显式转换

时间:2013-09-17 22:18:14

标签: java variables casting int short

有人可以解释为什么以下声明:

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

给我:

-7936

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

3 个答案:

答案 0 :(得分:20)

你的价值1亿,我得到-7936。如果我改变1亿到100万,我只能获得16960。

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

答案 1 :(得分: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);

答案 2 :(得分:0)

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.这与我们的数字相同   以前看着。并且,正如你所看到的,它是负面的,不像   原始价值。