2017-12-20 36 views
4

bitwiseOR(|)が== a && bである必要がある場合、1410065407が返されるのはなぜですか?javacript intの精度は15の精度であると考えます。bitwiseORで正しい値が返されない

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});

+0

浮動小数点計算には*種類の*のみが適用されます(小数点以下は二項演算の上にある壊れた抽象レイヤーにすぎません)。整数計算ではありません。 – harold

答えて

5

[...] JavaScriptの整数精度は15数

れていない番号が、32 ビットに正確であることを考慮します。

値が9,999,999,999の場合、完全な32ビット範囲、つまり4,294,967,296(または2^32)よりも高いため、ビット数が32ビットの場合に発生する32ビットに「変換」(クランプ)賢いO​​P:

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

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

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

だから何が起こるかは、1)数が32ビットの範囲、つまり141006540​​7この場合にクランプされていることです

2)両方の数値が最初にクランプされるため、同じ結果をもたらす2)ORで結合されます。

第2の例では、番号999,999,999が32ビットの範囲内にあり、クランプが不要であることがわかります。