JavaScript и Python побитовая операция ИЛИ дала разные результаты - PullRequest
0 голосов
/ 25 февраля 2020

JS

console.log(1 | 1); // 1
console.log(1 | 0x8); // 9
console.log(1 | 0x80000000); // -2147483647

python

print (1 | 1) # 1
print (1 | 0x8) # 9
print (1 | 0x80000000) # 2147483649

Почему результаты в последних примерах отличаются?

1 Ответ

2 голосов
/ 25 февраля 2020
Поведение

Tha JavaScript описано в MDN

Операнды всех побитовых операторов преобразуются в 32-разрядные целые числа со знаком в формате дополнения до двух, за исключением нуля. заполнить сдвиг вправо, что приводит к 32-разрядному целому числу без знака.

Таким образом, вы получите отрицательные числа в JavaScript, поскольку оно обрабатывает значение как 32-разрядное число со знаком. Бит 0x80000000 является знаковым битом.

Спецификатор в конце приведенной выше цитаты указывает способ получить тот же результат, что и Python:

console.log((1 | 0x80000000) >>> 0);

>>> - оператор смещения вправо с нулевым заполнением. Сдвиг на 0 бит не меняет значение, но он конвертируется в беззнаковое.

Python целые числа имеют бесконечную точность, поэтому они не переносятся на отрицательные числа, когда получают 32 бита.

...