Java - 从 Int 到 Short 的显式转换
有人可以解释为什么有以下说法吗:
short value = (short) 100000000;
System.out.println(value);
给我:
-7936
知道 Java 中空头的最大值是 32767 是正确的吗?
有人可以解释为什么有以下说法吗:
short value = (short) 100000000;
System.out.println(value);
给我:
-7936
知道 Java 中空头的最大值是 32767 是正确的吗?
你的价值为1亿,我得到-7936。如果我把1亿改成100万,我只能得到16960。
原因是值限制为 -32768 到 +32767,而 Java 在强制转换为 时仅保留最不重要的 16 位(缩小基元转换,JLS 5.1.3)。实际上,此操作:100 万 mod 2^16(a 中的 16 位)为 16960。short
short
short
您这样做的方式只是在同一内存位置重新解释较少的位。它不会改变它们。
您可能希望使用 and 函数来检测值何时超出,并在发生这种情况时分配空头的最大值或最小值。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);