为什么我们不能移动一个整数超过整数的大小?

问题描述

在与 GFG 上的“按位运算符”相关的线程中写道,

如果数字移位超过整数的大小,则 行为未定义。例如,如果整数,则 1

但是当我尝试在 Java 中执行相同的操作时,我得到以下结果,

1 1

1 2

1 4

1 8

而且这些结果也是合理的。由于整数是 32 位,所以当我将 1 左移 32 位时,它会遍历所有 31 位并返回第 0 个位置,因此我们得到值 1。

那结果是如何未定义的呢? Java 不是 undefined 吗?

这是该线程的链接:https://www.geeksforgeeks.org/bitwise-operators-in-c-cpp/

解决方法

在 Java 中,当您对 int 进行移位时,只会考虑移位操作数的低 5 位。所以行为是定义的,但它不希望你想要它。

这在语言规范 https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.19 以及用于移位的虚拟机指令的定义中都有详细说明,例如 ishl 此处:https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.ishl

至于为什么...这是因为 x86(我预计还有许多其他)CPU 的移位指令就是这样做的,而 Java 语言设计者不想增加开销以另一种方式计算它。

因为他们实际上定义了它,如果你在没有这个问题的架构上运行 java,它会显式地屏蔽掉移位中的高位。 C 和 C++ 编译器未定义行为,因此它们的编译器永远不必这样做。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...