微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。