与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;导致?
答案 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