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



在GFG上与'位运算符'相关的线程中,它是这样写的,

如果移位数大于整数的大小,则行为是未定义的。例如:1 <<如果是整数,33是未定义的使用32位

存储

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

1 & lt; & lt; 32 =比;1

1 & lt; & lt; 33 =比;2

1 & lt; & lt; 34 =比;4

1 & lt; & lt; 35 =比;8

这些结果也被证明是正确的。因为整数是32位的,所以当我左移1位32位时,它会遍历所有31位并回到第0位,因此我们得到值1。我相信<<33, <<34和<<35也是如此。

那么结果是如何未定义的呢?在Java中它不是未定义的吗?

这是到线程的链接: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++编译器不定义该行为,因此它们的编译器永远不会这样做。

相关内容

  • 没有找到相关文章

最新更新