如何将 js 中的 var 转换为 java

How to convert the var in js into java?

本文关键字:转换 java var 中的 js      更新时间:2023-09-26

现在我尝试将一些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。 这是一个猜测,可能是出于另一个原因。