位移位操作选择

e5njpo68  于 2021-07-03  发布在  Java
关注(0)|答案(3)|浏览(315)

大家好,我正在学习java编程,我想知道为什么符号位传播的选择是“>>”而不是“>>>”?我假设<<和>>应该有相同的实现。抱歉,如果这听起来像个愚蠢的问题:)
提前谢谢!

cnh2zyt3

cnh2zyt31#

它这样工作的原因是因为c和c使用 << 左移和 >> 早在java之前就开始右移了。这些语言同时具有有符号和无符号类型,对于有符号类型,符号位以右移形式传播。
java没有无符号类型,因此它们保留了c和c
的行为,以免造成混乱,招致全世界开发人员的愤怒。然后他们包括 >>> 提供将位值视为无符号的右移。

pexxcrt2

pexxcrt22#

这个问题其实是关于阅读詹姆斯戈斯林的思想:-)。但我猜是这样的 << 以及 >> 两者在数学上都有意义: << 使数字乘以2(禁止溢出),并且 >> 使一个数除以2——当您有符号传播时,无论该数是正的还是负的,这都起作用。也许语言设计者认为这是右移位的一种更常见的用法,而不是传播0的运算符,当整数被视为比特串而不是实际的数字时,右移位更有用。这两种方式都不是“对”或“错”,如果高斯林那天早上早餐吃了不同的东西,他可能会以你的方式看待事情。。。

jdg4fx2g

jdg4fx2g3#

让我们从你没有问的问题开始:-)
问:为什么没有 <<< ?
a1:因为 << 对两者执行适当的反向操作 >> 以及 >>> . >> N 对于有符号整数,等价于除以2n >>> N 对于无符号整数等于除以2n << N 对于有符号整数和无符号整数,等价于乘以2n
a2:因为符号位在左手端,所以向左移动时“延伸”它是没有意义的(旋转是有意义的,但是java没有任何“旋转”操作符。原因:c语言的先例,一些指令集缺乏硬件支持,java代码中很少需要旋转。)
问:为什么只有一个 >> 以及 >>> 签署延期
a:因为如果他们都有(或者都没有),那么你就不需要两个操作符了。
现在回答你的问题(我想):
问:他们为什么选择 >> 做符号扩展而不是 >>> ?
答:这真是无法回答。据我们所知,目前还没有公开的原始oak/java语言设计决策的同期记录。充其量,我们只能依靠詹姆斯·戈斯林的记忆。。。他愿意回答问题。好吧,这个问题还没问。
但我的猜测是,由于java整数类型(大部分)是有符号的,因此 >> 运算符将更常用。事后看来,我认为高斯林等人是对的。
但这不是关于复制c或c++。在这些语言中,只有一个右移运算符( >> )它对有符号整数的行为是实现定义的!!。这个 >>> java中的操作符就是为了解决这个问题而设计的;i、 e.消除c/c++的可移植性问题 >> .
(参考:c11语言规范草案第6.5.7节)
接下来您的评论:
我会假设 << 以及 >> 应该有相同的实现。我所说的相同的实现是指相同的过程,但方向相反。
以上就是答案。从实用功能的Angular 来看, >> 以及 << 对有符号的数字执行相同的过程,但方向不同;i、 除法与乘法。对于无符号数字 <<< 对应于 >> 以同样的方式?
为什么不同?基本上可以归结为2的补码和无符号二进制表示的数学。
请注意,您不能执行 >> 或者 >>> . 直观地说,这些运算符会丢弃右端的位。一旦扔掉,这些碎片就无法恢复。
问:那他们为什么不 << (或假设的) <<< )“伸出”右手钻头?
a:因为:
这是没有用的(我想不出任何扩展数字右位的主流用例。)
通常没有硬件支持(。。。因为它没有用!)

相关问题