Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将js中的var转换为java?_Java_Javascript_Numbers - Fatal编程技术网

如何将js中的var转换为java?

如何将js中的var转换为java?,java,javascript,numbers,Java,Javascript,Numbers,现在我正在尝试将一些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 那么,为什么|操作符会将两

现在我正在尝试将一些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代码呢

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

更多问题:

&
也是32位操作,然后: 在js中

2996101485&65535=57709

在爪哇

2996101485是溢出到int的,所以我使用double来存储它,并在需要执行和时将其转换为int

双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;
    }
}
私人双门(双x,双y){

如果(x>Integer.MAX_值&&x,则应改用
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中最大的数字是9007199254740992。这是一个猜测,可能是另一个原因。

问题是,虽然JavaScript中的数字(它们似乎基于浮点双精度),但

按位运算符将其操作数视为32位(0和1)的序列,而不是十进制、十六进制或八进制数


这意味着在使用算术时,
long
将为您提供类似JavaScript的算术(使用像您这样的数字),因为Java
int
s会溢出;但是当使用逐位操作时,
int
会得到类似JavaScript的结果,因为这两个平台都是在32位数字上运行的。

我尝试过这个,但是使用
时结果与js不同。我正在提名重新打开。标记为du的那个plicate可以解释
|
,但这不是同一个问题。因此,当我使用或操作时,js让数字为32位精度?基本上,是的。至少,从我读到的内容来看是什么!我不知道JavaScript,也不知道Java。如果我在执行或操作之前将
long
转换为
int
,我会看到您的更新tes,它会像js一样运行吗?这应该可以,是的——但请确保将所有操作数强制转换为
int
,否则只有一个操作数会导致它们全部升级为
long
!顺便说一句,这正是您在第三个Java代码段中的内容,
(46022*65535)|7867=-1278910789
——在该代码段中,所有操作数都是
int