没有一些代码很难解释..所以
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 将所有数字存储为双 float ,并且确保不会丢失适合 53 位的整数的精度。
尝试使用相同的值,如果使用 >>
,您将获得与 ActionScript 中相同的结果,但如果使用 >>>
,则获得与 Java 相同的结果。
在 JavaScript 方面,似乎 >>
(又名算术移位)首先将值转换为 32 位有符号整数,而 >>>
(又名逻辑移位)则不会。 。
这很奇怪,而且 ActionScript 做类似的事情也就不足为奇了。
有趣的是,Python 没有 >>>
运算符,总是进行算术移位,并且似乎甚至可以在 64 位以上工作。
考虑到 this question 的受欢迎程度
或this one , >>
与 >>>
是存在这两个运算符的语言中常见的混淆来源。
关于java - 为什么 AS3 右移位与 Java 中的右移位不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50952388/