现在我尝试将一些js代码转换为java,有一个问题:
在 js 中
46022*65535 = 3016051770
和
(46022*65535)|7867 = -1278910789
在爪哇中
46022*65535 = -1278915526这是溢出
46022L*65535L = 3016051770L 这与 JS 的结果相同
(46022*65535)|7867 = -1278910789这个和下面的一个是问题
(46022L*65535L)|7867L = 3016056507L
那么,为什么|
算子会把两个正数做成唠叨数呢?java 和 js 在处理 int 和 long 来执行此操作时有什么区别?
那么,在这种情况下如何编写兼容js的java代码呢?
注意:I知道int和long的范围,我的问题|
。
更多问题 :
据 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators &
也是 32 位操作,那么:在 js 中
2996101485 & 65535 = 57709
在爪哇中
2996101485溢出到 int,所以我使用 double 来存储它,并在需要执行 AND 时将其转换为 int。
双 A = 2996101485L;
双倍 b = 65535;
int c = (int) a & (int) b;现在 c = 65535
但是如果我用长来投射:
长 c = (多头) A 和 (长) b;现在 c = 57709
所以,只是简单地将 double 转换为 int 会导致问题。我想知道为什么?
我遇到了问题,2996101485可以在 js 中以 32 位存在,而在 java 中它应该很长。所以我写了函数来转换这些操作,例如,&
应该使用这个java函数在js中运行给出相同的结果:
private double doOR(double x, double y) {
if (x > Integer.MAX_VALUE && x <= 1l << 32) {
if (y > Integer.MAX_VALUE && y <= 1l << 32) {
return (long) x | (long) y;
} else {
return (long) x | (int) y;
}
} else {
return (int) x | (int) y;
}
}
问题是,虽然 JavaScript 中的数字具有大约 53 位的精度(它们似乎基于浮点双精度),但按位 OR 仅在 32 位上运行。
按位运算符将其操作数视为 32 位(零和一)的序列,而不是十进制、十六进制或八进制数。
这意味着在处理算术时,long
会得到类似JavaScript的算术(像你这样的数字),因为Java int
会溢出;但是当使用按位运算时,int
会得到类似JavaScript的结果,因为那时两个平台都在32位数字上运行。
你应该改用long
。
System.out.println(46022L*65535L); // = 3016051770
Java有整数和长整型。
System.out.println(Integer.MAX_VALUE); // = 2147483647
System.out.println(Long.MAX_VALUE); // = 9,223,372,036,854,775,807
至于语言差异,我只能将其归因于语言之间的不同精度。 如果你看到这个问题,你会看到JS中最大的数字是9,007,199,254,740,992。 这是一个猜测,可能是出于另一个原因。