这是一个 Java 程序,它将 short
的 2
值左移。我有两个问题:
为什么 num << i
值在 16 到 29 之间时会产生有效结果? i
只能保存从 -32,768 到 32,767 的值。
所以我想,也许 short
将 System.out.println
解释为大于 num << i
的值。但是为什么它开始在 short
处产生意外的值呢?
public class LeftShift {
public static void main(String[] args)
{
short num = 2;
for (int i = 0; i < 32; i++) {
System.out.println("Left-shifting 2 by " + i + " places yields: "
+ (num << i));
}
}
}
输出:
Left-shifting 2 by 0 places yields: 2
Left-shifting 2 by 1 places yields: 4
Left-shifting 2 by 2 places yields: 8
Left-shifting 2 by 3 places yields: 16
Left-shifting 2 by 4 places yields: 32
Left-shifting 2 by 5 places yields: 64
Left-shifting 2 by 6 places yields: 128
Left-shifting 2 by 7 places yields: 256
Left-shifting 2 by 8 places yields: 512
Left-shifting 2 by 9 places yields: 1024
Left-shifting 2 by 10 places yields: 2048
Left-shifting 2 by 11 places yields: 4096
Left-shifting 2 by 12 places yields: 8192
Left-shifting 2 by 13 places yields: 16384
Left-shifting 2 by 14 places yields: 32768
Left-shifting 2 by 15 places yields: 65536
Left-shifting 2 by 16 places yields: 131072
Left-shifting 2 by 17 places yields: 262144
Left-shifting 2 by 18 places yields: 524288
Left-shifting 2 by 19 places yields: 1048576
Left-shifting 2 by 20 places yields: 2097152
Left-shifting 2 by 21 places yields: 4194304
Left-shifting 2 by 22 places yields: 8388608
Left-shifting 2 by 23 places yields: 16777216
Left-shifting 2 by 24 places yields: 33554432
Left-shifting 2 by 25 places yields: 67108864
Left-shifting 2 by 26 places yields: 134217728
Left-shifting 2 by 27 places yields: 268435456
Left-shifting 2 by 28 places yields: 536870912
Left-shifting 2 by 29 places yields: 1073741824
Left-shifting 2 by 30 places yields: -2147483648
Left-shifting 2 by 31 places yields: 0
最佳答案
因为 short
上的算术运算会产生 int
,除非你将它们强制转换回来。例如,
short value = 2;
short result = value << 31;
给您一个编译错误,您需要将其转换为short
。
这有几个原因,最值得注意的是
- 字节码语言并不真正处理任何小于
int
的类型 - 否则
short
上的操作会更频繁地溢出。 - 为了更好地模拟大多数硬件,这些硬件通常不会对低于 32 位的值进行操作
关于java - Java 中的位移位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10799907/