Представлять -1 как истинный двоичный шаблон

#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 такого разделения нет. Однако я не знаю ситуации, когда это изменило бы то, что я написал выше.