为什么 AS3 右移位与 Java 中的相同内容不同?

Why is AS3 right bit shift different than the same thing in Java?

没有一些代码很难解释..所以

var junk:uint = uint(4294280300);

trace(junk.toString(2)); // returns 11111111111101011000010001101100
junk = junk >> 8;
trace(junk.toString(2)); // returns 11111111111111111111010110000100

这是Java部分

long junk = 4294280300L;

System.out.println(Long.toBinaryString(junk)); // returns 11111111111101011000010001101100
junk = junk >> 8;
System.out.println(Long.toBinaryString(junk)); // returns 111111111111010110000100

我做错了什么?如何在 Java 中获得相同的结果?我试过使用 >>> 而不是 >> 但它似乎不起作用。

我完全不懂 ActionScript,但由于数字内部表示的差异,可以肯定。

ActionScript 的 uint 类型似乎确实是一个 32 位编码的无符号整数。 此外,在执行右移操作之前,该数字似乎已转换为有符号整数。这种违反直觉的行为解释了结果。

你在Java中没有这个问题,因为 long 是一个编码为 64 位的整数,而值 4294280300 完全适合 64 位。 如果您使用 int 而不是 long,您会观察到与 ActionScript 中相同的结果。

让我们看看 JavaScript 做了什么以更好地理解 ActionScript 中似乎发生的事情:JavaScript 将所有数字存储为双浮点数,并且您肯定不会丢失整数的精度可以放入 53 位。 尝试使用相同的值,如果您使用 >>,您会看到与 ActionScript 中相同的结果,但如果您使用 >>>.

,则与 Java 相同

ON Java脚本方面,似乎 >> a.k.a 算术移位首先将值转换为 32 位有符号整数,而 >>> a.k.a逻辑移位。 这很奇怪,而且 ActionScript 做类似的事情也不足为奇。

有趣的是,python 没有 >>> 运算符,总是进行算术移位,似乎甚至可以在 64 位以上工作。

鉴于 this question 的受欢迎程度 或 >>>>> 是存在这两个运算符的语言中常见的混淆来源。