大家好,我正在学习java编程,我想知道为什么符号位传播的选择是“>>”而不是“>>>”?我假设<<和>>应该有相同的实现。抱歉,如果这听起来像个愚蠢的问题:)提前谢谢!
cnh2zyt31#
它这样工作的原因是因为c和c使用 << 左移和 >> 早在java之前就开始右移了。这些语言同时具有有符号和无符号类型,对于有符号类型,符号位以右移形式传播。java没有无符号类型,因此它们保留了c和c的行为,以免造成混乱,招致全世界开发人员的愤怒。然后他们包括 >>> 提供将位值视为无符号的右移。
<<
>>
>>>
pexxcrt22#
这个问题其实是关于阅读詹姆斯戈斯林的思想:-)。但我猜是这样的 << 以及 >> 两者在数学上都有意义: << 使数字乘以2(禁止溢出),并且 >> 使一个数除以2——当您有符号传播时,无论该数是正的还是负的,这都起作用。也许语言设计者认为这是右移位的一种更常见的用法,而不是传播0的运算符,当整数被视为比特串而不是实际的数字时,右移位更有用。这两种方式都不是“对”或“错”,如果高斯林那天早上早餐吃了不同的东西,他可能会以你的方式看待事情。。。
jdg4fx2g3#
让我们从你没有问的问题开始:-)问:为什么没有 <<< ?a1:因为 << 对两者执行适当的反向操作 >> 以及 >>> . >> N 对于有符号整数,等价于除以2n >>> N 对于无符号整数等于除以2n << N 对于有符号整数和无符号整数,等价于乘以2na2:因为符号位在左手端,所以向左移动时“延伸”它是没有意义的(旋转是有意义的,但是java没有任何“旋转”操作符。原因:c语言的先例,一些指令集缺乏硬件支持,java代码中很少需要旋转。)问:为什么只有一个 >> 以及 >>> 签署延期a:因为如果他们都有(或者都没有),那么你就不需要两个操作符了。现在回答你的问题(我想):问:他们为什么选择 >> 做符号扩展而不是 >>> ?答:这真是无法回答。据我们所知,目前还没有公开的原始oak/java语言设计决策的同期记录。充其量,我们只能依靠詹姆斯·戈斯林的记忆。。。他愿意回答问题。好吧,这个问题还没问。但我的猜测是,由于java整数类型(大部分)是有符号的,因此 >> 运算符将更常用。事后看来,我认为高斯林等人是对的。但这不是关于复制c或c++。在这些语言中,只有一个右移运算符( >> )它对有符号整数的行为是实现定义的!!。这个 >>> java中的操作符就是为了解决这个问题而设计的;i、 e.消除c/c++的可移植性问题 >> .(参考:c11语言规范草案第6.5.7节)接下来您的评论:我会假设 << 以及 >> 应该有相同的实现。我所说的相同的实现是指相同的过程,但方向相反。以上就是答案。从实用功能的Angular 来看, >> 以及 << 对有符号的数字执行相同的过程,但方向不同;i、 除法与乘法。对于无符号数字 <<< 对应于 >> 以同样的方式?为什么不同?基本上可以归结为2的补码和无符号二进制表示的数学。请注意,您不能执行 >> 或者 >>> . 直观地说,这些运算符会丢弃右端的位。一旦扔掉,这些碎片就无法恢复。问:那他们为什么不 << (或假设的) <<< )“伸出”右手钻头?a:因为:这是没有用的(我想不出任何扩展数字右位的主流用例。)通常没有硬件支持(。。。因为它没有用!)
<<<
>> N
>>> N
<< N
3条答案
按热度按时间cnh2zyt31#
它这样工作的原因是因为c和c使用
<<
左移和>>
早在java之前就开始右移了。这些语言同时具有有符号和无符号类型,对于有符号类型,符号位以右移形式传播。java没有无符号类型,因此它们保留了c和c的行为,以免造成混乱,招致全世界开发人员的愤怒。然后他们包括
>>>
提供将位值视为无符号的右移。pexxcrt22#
这个问题其实是关于阅读詹姆斯戈斯林的思想:-)。但我猜是这样的
<<
以及>>
两者在数学上都有意义:<<
使数字乘以2(禁止溢出),并且>>
使一个数除以2——当您有符号传播时,无论该数是正的还是负的,这都起作用。也许语言设计者认为这是右移位的一种更常见的用法,而不是传播0的运算符,当整数被视为比特串而不是实际的数字时,右移位更有用。这两种方式都不是“对”或“错”,如果高斯林那天早上早餐吃了不同的东西,他可能会以你的方式看待事情。。。jdg4fx2g3#
让我们从你没有问的问题开始:-)
问:为什么没有
<<<
?a1:因为
<<
对两者执行适当的反向操作>>
以及>>>
.>> N
对于有符号整数,等价于除以2n>>> N
对于无符号整数等于除以2n<< N
对于有符号整数和无符号整数,等价于乘以2na2:因为符号位在左手端,所以向左移动时“延伸”它是没有意义的(旋转是有意义的,但是java没有任何“旋转”操作符。原因:c语言的先例,一些指令集缺乏硬件支持,java代码中很少需要旋转。)
问:为什么只有一个
>>
以及>>>
签署延期a:因为如果他们都有(或者都没有),那么你就不需要两个操作符了。
现在回答你的问题(我想):
问:他们为什么选择
>>
做符号扩展而不是>>>
?答:这真是无法回答。据我们所知,目前还没有公开的原始oak/java语言设计决策的同期记录。充其量,我们只能依靠詹姆斯·戈斯林的记忆。。。他愿意回答问题。好吧,这个问题还没问。
但我的猜测是,由于java整数类型(大部分)是有符号的,因此
>>
运算符将更常用。事后看来,我认为高斯林等人是对的。但这不是关于复制c或c++。在这些语言中,只有一个右移运算符(
>>
)它对有符号整数的行为是实现定义的!!。这个>>>
java中的操作符就是为了解决这个问题而设计的;i、 e.消除c/c++的可移植性问题>>
.(参考:c11语言规范草案第6.5.7节)
接下来您的评论:
我会假设
<<
以及>>
应该有相同的实现。我所说的相同的实现是指相同的过程,但方向相反。以上就是答案。从实用功能的Angular 来看,
>>
以及<<
对有符号的数字执行相同的过程,但方向不同;i、 除法与乘法。对于无符号数字<<<
对应于>>
以同样的方式?为什么不同?基本上可以归结为2的补码和无符号二进制表示的数学。
请注意,您不能执行
>>
或者>>>
. 直观地说,这些运算符会丢弃右端的位。一旦扔掉,这些碎片就无法恢复。问:那他们为什么不
<<
(或假设的)<<<
)“伸出”右手钻头?a:因为:
这是没有用的(我想不出任何扩展数字右位的主流用例。)
通常没有硬件支持(。。。因为它没有用!)