当前位置: 首页 > 面试题库 >

为什么(-1 >>> 32)= -1?

余靖
2023-03-14
问题内容

-1作为转换为二进制的int表示为321。当我右移31次时,得到1(31个0和一个1)。但是当我右移32次时,我又得到-1。它不应该等于0吗?


问题答案:

Java规范对移位运算符的解释如下:

如果左侧操作数的提升类型为int,则仅将右侧操作数的最低5位用作移位距离。就像右手操作数受到掩码值的按位逻辑AND运算符&(第15.22.1节)一样0x1f。因此,实际使用的移动距离始终在0到31(含)范围内。

的值32 & 0x1f为零。

如果左侧操作数为long,则您会为右侧操作数获得一个额外的位,将上限扩展为63而不是31。

为了具有从-1向右移动的任何特定期望值,您需要指定整数的基本二进制表示形式(例如,二进制补码)以及位数(例如,32)。每种编程语言都可以不同地定义它们,但是为了使实现更简单,通常会指定不允许移位超过可用位数。这通常是因为基础CPU硬件也不支持它。毕竟,如果要移位那么多位,则左操作数不再重要,因为结果将始终相同。



 类似资料:
  • 问题内容: 我想知道这是否是JVM错误? Java版本“ 1.6.0_0” OpenJDK运行时环境(IcedTea6 1.4.1)(6b14-1.4.1-0ubuntu13)OpenJDK 64位服务器VM(内部版本14.0-b08,混合模式) 当我运行它时会产生这个: 对于32的任意倍数,我也得到相同的结果。 我需要编写自己的右移来检查吗? 问题答案: http://docs.oracle.c

  • 问题内容: 为什么呢?如我所料是0。 问题答案: 所有移位都针对整数进行mod 32,对long进行mod 64。 从规范的第15.19节开始: 如果左侧操作数的提升类型为,则仅将右侧操作数的最低5位用作移位距离。就像右侧操作数受到掩码值0x1f的按位逻辑AND运算符&(§15.22.1)一样。因此,实际使用的移动距离始终在0到31(含)范围内。 如果左侧操作数的提升类型为,则仅将右侧操作数的六个

  • 问题内容: Python如何评估表达式? 我插了多少,这就是答案。请任何人可以解释这种行为 因为它是印刷,因为它是印刷 问题答案: 您的表情与: 可以在任何数字表达式之前使其为负,或不执行任何操作(存在对称性选项)。带有负号: 和 我看到您澄清了您的问题,说您来自C背景。在Python中,没有像C和C这样的增量运算符,这可能是造成混淆的原因。要递增或递减变量,或在Python中使用以下样式:

  • 本文向大家介绍1:为什么学习Python相关面试题,主要包含被问及1:为什么学习Python时的应答技巧和注意事项,需要的朋友参考一下  

  • 已经7岁的Node.js,你还熟悉么? 以前?现在? 2.1. 回顾一下2015年Node.js的发展历史 http://i5ting.github.io/history-of-node-js/ 2.1.1. Q1(1季度) IO.js 1.0.0 发布 Joyent 推进建立 Node.js 基金会 Joyent, IBM, Microsoft, PayPal, Fidelity, SAP an

  • 问题内容: 是真的。 我知道Java中的整数是32位,并且不能超过2 31 -1,但是我不明白为什么要在其结果中加1 而不是某种例外。更不用说像Ruby这样的透明转换为更大的类型了。 是否在某处指定了此行为?我可以依靠吗? 问题答案: 因为整数溢出。溢出时,下一个值为。相关JLS 如果整数加法溢出,则结果是数学和的低阶位,以某种足够大的二进制补码格式表示。如果发生溢出,则结果的符号与两个操作数值的