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