битовое представление в python - PullRequest
2 голосов
/ 13 июля 2020

Привет, у меня вопрос о битовом представлении в python

, когда я использую битовую операцию 1 << 31, тогда мы видим, что биты </p>

1000 0000 0000 0000 0000 0000 0000 0000

python напечатает это значение как 2147483648

, но когда я даю значение переменной, например a = -2 ** 31

, биты также

1000 0000 0000 0000 0000 0000 0000 0000

но python напечатает -2147483648

, поэтому, если биты совпадают, как python решит использовать 2147483648 или -2147483648?

Ответы [ 2 ]

2 голосов
/ 13 июля 2020

В python целые числа не имеют ограниченной точности. Это означает, среди прочего, что числа не хранятся в двоичном формате. Знак НЕ хранится в битовом представлении числа.

Таким образом, все -2**31, 2**31 и 1<<31 будут иметь одинаковое битовое представление числа. Знаковая часть -2**31 не является частью побитового представления числа. Знак отдельный.

Вы можете увидеть это, если попробуете так:

>>> bin(5)
'0b101'
>>> bin(-5)
'-0b101'
2 голосов
/ 13 июля 2020

Представление на самом деле не то же самое. Вы можете использовать int.to_bytes, чтобы проверить это:

(1 << 31).to_bytes(32, 'big', signed=True)

b '\ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x80 \ x00 \ x00 \ x00 '

(-2 ** 31).to_bytes(32, 'big', signed=True)

b' \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ x80 \ x00 \ x00 \ x00 '

Также, будьте осторожны с оператором -, у которого здесь более низкий приоритет:

-2 ** 31 == -(2 ** 31)

...