为什么(-1 >>> 32)等于-1?

12

可能重复:
为什么1>>32等于1?

-1转换为int后的二进制形式表示为32个1。 当我将其右移31次时,得到1(31个0和一个1)。 但是当我把它右移32次时,我再次得到-1。 这不应该等于0吗?


1
看起来像是Java。我不知道有多少语言定义了>>>运算符。 - leppie
我在学习Java基础知识时遇到了这个问题,但我没有打标签,因为我认为位移是一个相当通用的概念。 - user183037
1
请参考以下网页:https://dev59.com/JHA75IYBdhLWcg3wqLD_ - user568493
鉴于用户的评论说他是在询问一般的移位操作,而不仅仅是Java中的移位操作,我认为这与@Bstn给出的链接不是完全重复的。这也是为什么在我的原始答案之后,我添加了一些与语言无关的信息(除此之外,我的答案与其他问题中的答案相同)。 - Rob Kennedy
这个问题涉及到完全不同的运算符,它不是一个重复的问题。 - Sam I am says Reinstate Monica
1个回答

18
Java规范解释了“移位运算符”的用法,其官方文档如下所示:
如果左操作数的推广类型是“int”,则仅使用右操作数的五个最低位作为移位距离。就好像将右操作数与掩码值“0x1f”进行按位逻辑AND运算(§15.22.1)。因此实际使用的移位距离始终在0至31(包括31)之间。 32 & 0x1f的值为零。
如果左操作数是“long”,则右操作数会多出一个比特位,将上限扩大到63而不是31。
如果要从右移-1中获得任何特定的期望值,则需要指定整数的底层二进制表示形式(例如,二进制补码),以及位数(例如,32)。每种编程语言都可以对它们进行不同的定义,但为了使实现更加简单,它们通常会指定不允许移动超过可用位数。这通常是因为底层CPU硬件也不支持它。毕竟,如果要移动那么多位,左操作数将不再重要,因为结果始终相同。

1
йЎәдҫҝжҸҗдёҖдёӢпјҢиҝҷж„Ҹе‘ізқҖжӮЁеҸҜд»ҘдҪҝз”Ё x >> 63 жҲ– x >> -1 жқҘиҺ·еҸ– x зҡ„жңҖй«ҳдҪҚпјҢж— и®ә x жҳҜ int иҝҳжҳҜ longгҖӮ ;) - Peter Lawrey
移位可能还取决于32/64位系统。 - TheCottonSilk
@TheCottonSilk 不是在Java中;移位操作的方式是相同的,无论您使用的是32位还是64位操作系统或JVM。 - Jesper
@Jesper:你说得对。我没有注意到后来添加的Java标签:)。我的评论是针对编译器和底层架构的,提醒不要根据一个场景做出假设。 - TheCottonSilk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接