JS. Неожиданный результат при битовом ИЛИ двух чисел

var a = 0x81000000; //   2164260864
var b = 0x00FFFFFF; //   16777215
var c = 0x81FFFFFF; //   2181038079
var d = a | b; //        -2113929217

var test = c == d; //    false

Собственно вопрос: Как можно объяснить подобное поведение JS и в каком случае выражение d == c будет истинно, при A>=0x80000000?


Ответы (1 шт):

Автор решения: Stanislav Volodarskiy

Равенства не будет никогда потому что 0x81FFFFFF не принадлежит диапазону [-2147483648, 2147483647].

Все битовые операции в JavaScript приводят свои аргументы и результаты к 32-хбитовым целым числам со знаком. Например, значение 0x81000000 не помещается в диапазон и будет приведено. Результат приведения -2130706432:

$ node
> let a = 0x81000000;
undefined
> a
2164260864
> a | 0
-2130706432

Чтобы добиться равенства приведите обе стороны:

> (0x81FFFFFF | 0) === (0x81000000 | 0x00FFFFFF)
true
→ Ссылка