在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++编译器不定义该行为,因此它们的编译器永远不会这样做。