Java - 从 Int 到 Short 的显式转换

2022-09-03 12:16:01

有人可以解释为什么有以下说法吗:

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

给我:

-7936

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


答案 1

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

原因是值限制为 -32768 到 +32767,而 Java 在强制转换为 时仅保留最不重要的 16 位(缩小基元转换,JLS 5.1.3)。实际上,此操作:100 万 mod 2^16(a 中的 16 位)为 16960。shortshortshort


答案 2

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

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

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);