是否有人可以解释为什么这下面的语句:
short value = (short) 100000000;
System.out.println(value);
给我:
-7936
知道了在Java中的短的最大值为32767是否正确?
随着你的100万元价值,我得到-7936。我只能得到16960如果我兑换100万至100万美元。
其原因是,short
值被限定在-32768至32767,和铸造到short
(一个narrowing primitive conversion, JLS 5.1.3)时的Java仅保持至少显著16位。有效此操作:100万个模2 ^ 16(在一个short
16位)是16960。
你做了它的方式重新诠释只是在相同的存储器位置的小位数。它并没有改变他们。
你可能想使用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);
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.这是我们在看之前相同的号码。而且,正如你所看到的,它是负的,不像原来的值。