如何将js中的var转成java?

How to convert the var in js into java?

现在尝试把一些js代码转成java,有问题:

在 js 中

46022*65535 = 3016051770

and

(46022*65535)|7867 = -1278910789

在java

46022*65535 = -1278915526 this is overflow

46022L*65535L = 3016051770L this is the same result to js

(46022*65535)|7867 = -1278910789 this one and the one below is the problem

(46022L*65535L)|7867L = 3016056507L

那么,为什么|运算符会将两个正数变成负数? java和js处理int和long做这个操作有什么区别?

然后,在这种情况下,如何写java兼容js的代码?

注意:我知道 int 和 long 的范围,我的问题是 |.

更多问题:

根据https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators &也是32bit操作,那么: 在 js

2996101485 & 65535 = 57709

在java

2996101485 is overflow to int so I use double to store it and cast it into int when I need to do AND.

double a = 2996101485l;

double b = 65535;

int c = (int) a & (int) b; Now c = 65535

但是如果我使用 long 进行投射:

long c = (long) a & (long) b; Now c = 57709

所以,简单地将 double 转换为 int 会导致问题。我想知道为什么?

我遇到了问题,2996101485 可以在 32 位中出现在 js 中,而在 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;
    }
}

您应该改用 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。这是猜测,也有可能是别的原因。

问题是 Java脚本中的数字 have roughly 53-bit precision (they appear to be based on floating point doubles), the bitwise OR operates on only 32 bits.

Bitwise operators treat their operands as a sequence of 32 bits (zeroes and ones), rather than as decimal, hexadecimal, or octal numbers.

这意味着在使用算术时,long 将为您提供 Java 类似脚本的算术(使用您的数字),因为 Java int s 会溢出;但是当使用按位运算时,int 会给你 Java 类似脚本的结果,从那时起这两个平台都在 32 位数字上运行。