#python-2.7
#python-2.7
Вопрос:
В отличие от python3, в python2 количество целых чисел ограничено
In [1]: bin(-1)
Out[1]: '-0b1'
-1' is represented as
-0b1′,
Как можно закодировать ‘-1’ как истинный двоичный шаблон, например ‘11111111111111111……’?
Ответ №1:
Чтобы кодировка дополнения two имела какое-либо значение, целые числа должны быть фиксированной длины. Целые числа в Python таковыми не являются, поэтому такая кодировка для них недоступна.
Однако Numpy использует такую кодировку. Таким образом,
import numpy as np
bin(np.uint8(-1))
# => '0b11111111'
bin(np.uint32(-1))
# => '0b11111111111111111111111111111111'
Однако для собственных целых чисел Python, 0b11111111
всегда 127
, не -1
; 0b11111111111111111111111111111111
всегда 4294967295
, не -1
. Поскольку целые числа в Python ограничены только памятью, любое количество единиц всегда будет выдавать только положительное целое число.
Другим способом принудительно использовать целые числа Python в C-подобных структурах, на этот раз без внешних библиотек, является struct
. Например.
bin(struct.unpack('I', struct.pack('i', -1))[0]) # 32-bit
bin(struct.unpack('B', struct.pack('b', -1))[0]) # 8-bit
Вы правы в том, что целые числа Python2 ограничены, но они прозрачно расширяются до длинных значений, которые таковыми не являются. В Python3 такого разделения нет. Однако я не знаю ситуации, когда это изменило бы то, что я написал выше.