现在我尝试将一些js代码转换为java,有一个问题:
在js
46022 * 65535 = 3016051770
和
(46022 * 65535)| 7867 = -1278910789
在java中
46022 * 65535 = -1278915526这是溢出
46022L * 65535L = 3016051770L这与js
的结果相同(46022 * 65535)| 7867 = -1278910789这一个和下面的问题是
(46022L * 65535L)| 7867L = 3016056507L
那么,为什么|
运算符会将两个正数作为nagtive数?
处理int和long时,java和js之间的区别是什么?
然后,在这种情况下如何编写与js兼容的java代码?
注意:我知道int和long的范围,我的问题是|
。
更多问题:
根据https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators
&
也是32位操作,然后:
在js
2996101485& 65535 = 57709
在java中
2996101485溢出到int所以我使用double来存储它并在我需要执行AND时将其强制转换为int。
double a = 2996101485l;
双b = 65535;
int c =(int)a& (int)b;现在c = 65535
但是如果我使用long来施展:
长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;
}
}
答案 0 :(得分:2)
您应该使用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
至于语言差异,我只能将它归因于语言之间的不同精确度。 If you see this question,您会看到JS中最大的数字是9,007,199,254,740,992。这是一个猜测,可能是出于另一个原因。
答案 1 :(得分:2)
问题在于虽然JavaScript have roughly 53-bit precision中的数字(它们似乎基于浮点数加倍),但是bitwise OR operates on only 32 bits。
按位运算符将其操作数视为32位(零和1)的序列,而不是十进制,十六进制或八进制数。
这意味着在使用算术时,long
将为您提供类似JavaScript的算术(使用像你这样的数字),因为Java int
会溢出;但是当使用按位操作时,int
将获得类似JavaScript的结果,因为这两个平台都在32位数字上运行。