按位或运算符未返回正确值

4
在以下情况下,为什么按位或(|)返回1410065407而不是==a&&b-考虑到Javascript int精度准确到15个数字?

let a = 9999999999; // 10d
let b = 9999999999; // 10d
let c = a | b;
let d = b | a;

console.log({a,b,c,d});

// example 2

let a2 = 999999999; // 9d
let b2 = 999999999; // 9d
let c2 = a2 | b2;
let d2 = b2 | a2;

console.log({a2,b2,c2,d2});


“15位数字”仅适用于浮点数计算(即使在这种情况下,十进制也只是在二进制算术之上的破碎抽象层),而不适用于整数计算。 - harold
1个回答

5

[...] 考虑到JavaScript整数精度可以达到15位数字。

不是数字,而是32个

值9999999999超出了完整的32位范围,即4294967296(或2 ^ 32),所以会发生“转换”(钳制)32位数字,在任何位操作中都会发生这种情况:

console.log(9999999999>>0);
console.log(9999999999&0xffffffff);
console.log(9999999999<<0);
console.log(9999999999|9999999999);
// etc.

发生的情况是数字被夹紧到32位范围内,这种情况下为1,410,065,407:

Full range would require 34-bits:
  1001010100000010111110001111111111 -> 9,999,999,999

Actual result, max 32-bits:
  --01010100000010111110001111111111 -> 1,410,065,407

然后 2) 进行按位或操作,由于两个数字都会首先被夹紧,因此将得到相同的结果。

在第二个示例中,数字 999,999,999 在 32 位范围内,因此无需夹紧即可通过。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接