有人可以解释为什么以下声明:
short value = (short) 100000000;
System.out.println(value);
给我:
-7936
知道Java中short的最大值是32767是否正确?
答案 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)
你这样做只是在同一个内存位置重新解释了较少的位数。它不会改变它们。
您可能希望使用max
和min
函数来检测值何时超出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.这与我们的数字相同 以前看着。并且,正如你所看到的,它是负面的,不像 原始价值。