为什么Java不支持<<<运算符

21

为什么Java不支持无符号左移(<<<)运算符,但支持无符号右移(>>>)运算符?


2
左移操作(Left shifts)可以说是非常奇怪。 - Richard J. Ross III
2
请问自己这个问题:这样的运算符会做什么? - Mysticial
1
无符号左移的意义何在?其他语言如JavaScript也不支持它。 - Benjamin Gruenbaum
@BenjaminGruenbaum 正确。在左移操作中,您不必担心数字的符号。 - gtgaxiola
ARM汇编语言(以及其他一些语言)对于算术和逻辑左移都有同义词ASL和LSL。(如果我没记错的话,这已经过去将近二十年了。) - Tom Hawtin - tackline
4个回答

21

Java添加了运算符">>>"来执行逻辑右移,但是由于逻辑和算术左移操作是相同的,因此在Java中没有"<<<"运算符。

来自Java中的移位...


为什么 Java 不支持左移位运算符?如果可能,请给出示例告诉我,因为我是初学者。 - Cs ツ
2
@BenjaminGruenbaum 这个回答解决了为什么和是否两个问题。 - Seth Carnegie
1
>>> 存在的原因是 Java 中缺少无符号数据类型。在 C/C++/C# 中,当左操作数为无符号时,使用逻辑右移,因此你甚至看不到 >>> - Alvin Wong

8
为什么Java不支持“<<<”(无符号左移)运算符,但支持“>>>”(无符号右移)运算符?
因为(假设存在的)无符号左移运算符会与现有的左移运算符完全相同。
(提示:将二进制整数乘以2等同于左移1位并使最右边的位为零,无论整数表示是有符号还是无符号。在纸上写一些示例并亲自测试即可。)

5
为什么Java不支持<<<(无符号左移)运算符,但支持>>>(无符号右移)运算符?原因是当您向左移位时,最左边的位(也称为有符号位)将被丢失。由于无符号左移运算符将完全执行与现有左移运算符相同的操作,因此我们没有它。

-1

我认为这是一个设计错误。<< 不是算术移位。 << 应该是乘以2的意思, 如果你执行

0xF0FFFFFF << 4

它会返回一个正数! 负数乘以2永远不应该得到一个正数。 <<正在执行 <<< 的工作。


那么它应该返回什么数字?如何将 F0FFFFFF * 2^4 表示为负的64位有符号值?(实际上 << 所做的是乘以2的幂...然后是标准Java int 溢出行为;即高位截断。这不是一个错误。) - Stephen C

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