Javascript uint32数学不起作用?

时间:2016-04-01 16:57:16

标签: javascript

与uint32数学有点奇怪:

a = new Uint32Array([1103515245, 1103527590, 0]);
a[2] = a[0] * a[1];
console.log(a[2]);

给出了2524872960,我认为这是错误的,因为在C:

#include <stdio.h>

int main() {
    unsigned a[3] = { 1103515245, 1103527590, 0 };
    a[2] = a[0] * a[1];
    printf("%u\n", a[2]);
    return 0;
}

提供2524872878(Windows计算器也是如此)

那又是什么呢?我使用的是Firefox 45.0.1

编辑:哦,如果这是预期的,那么我该如何复制&#34; C&#34;导致?

1 个答案:

答案 0 :(得分:4)

那是因为JS没有Integer类型。所以*在64位浮点数中进行乘法运算。但是这些结果没有足够的精确度:

/* Exact math */ 1103515245 × 1103527590  =  1217759518843109550
/* JavaScript */ 1103515245 * 1103527590 === 1217759518843109600
                 Number.MAX_SAFE_INTEGER === 0009007199254740991

如果要进行整数乘法,请使用Math.imul

  

Math.imul()函数返回类似C的32位结果   两个参数相乘。

a[2] = Math.imul(a[0], a[1]); // -1770094418
a[2];                         //  2524872878