gpt4 book ai didi

java - Java 中的位移位

转载 作者:行者123 更新时间:2023-12-03 06:02:12 25 4
gpt4 key购买 nike

这是一个 Java 程序,它将 short2 值左移。我有两个问题:

为什么 num << i 值在 16 到 29 之间时会产生有效结果? i 只能保存从 -32,768 到 32,767 的值。

所以我想,也许 shortSystem.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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com