>>> x = -4
>>> print("{} {:b}".format(x, x))
-4 -100
>>> mask = 0xFFFFFFFF
>>> print("{} {:b}".format(x & mask, x & mask))
4294967292 11111111111111111111111111111100
>>>
>>> x = 0b11111111111111111111111111111100
>>> print("{} {:b}".format(x, x))
4294967292 11111111111111111111111111111100
>>> print("{} {:b}".format(~(x ^ mask), ~(x ^ mask)))
-4 -100
Мне трудно понять, как Python представляет отрицательные целые числа, и, следовательно, как работают битовые операции. Я понимаю, что Python пытается подражать двум дополнениям, но с любым количеством бит. Поэтому обычно используют 32-битные маски, чтобы заставить Python устанавливать стандартный размер для целых чисел до операций с битами.
Как вы можете видеть в моем примере, -4 & 0xFFFFFFFF
дает большое положительное число. Почему Python, кажется, читает это как целое без знака, вместо отрицательного числа из двух дополнений? Позже операция ~(x ^ mask)
, которая должна дать то же самое два бита бита дополнения, что и большой положительный, вместо этого дает -4
. Что вызывает преобразование в подписанный int?
Спасибо!