Почему sys.maxsize.bit_length() равно 63, а не 64 в моей системе?

Недавно я узнал, как увидеть максимальное целое число int(), с которым может справиться моя арка x64. (Выше этого числа система использует long). Теперь я изучаю побитовые операторы и узнал на этом сайте, что целые числа в Python хранятся в системе дополнения до двух.

когда я печатаю:

print sys.maxsize.bit_length()

Я получаю 63 бита. Я думаю, что это зависит от моей машинной арки (Ubuntu 64 бит). Вопросы:

  • где бит № 64?
  • это лидирующие 0 или 1 в нотации дополнения к двум?
  • почему не входит в длину в битах?

Добавлено:

  • почему для отрицательных чисел нам нужно 64 бита, а не 63?

1 ответ

Потому что на вашей платформе значение получается из целого числа со знаком. Максимальное значение умещается в 63 бита, оставляя 64-й бит для отрицательных значений.

Обратите внимание, что int.bit_length() Метод дает минимальное количество битов, необходимое для представления этого конкретного целого числа, и никогда не включает начальные нули. Он ничего не говорит о лежащем в основе C целом числе:

>>> 1 .bit_length()
1
>>> 2 .bit_length()
2
>>> 3 .bit_length()
2
>>> 4 .bit_length()
3

От int.bit_length() документация:

Возвращает количество бит, необходимое для представления целого числа в двоичном коде, исключая знак и ведущие нули

sys.maxsize обычно отражает максимальное значение ssize_t C целое число может содержать, но это дает вам Python int объект. Тот факт, что тип C может использовать дополнение до двух, вряд ли имеет значение для типа Python.

Исходный код просто преобразует константу C в int объект, константа определяется в pyport.h и, следовательно, зависит от платформы, как это значение получено. Для Linux это будет:

typedef ssize_t         Py_ssize_t;
/* ... */
#define PY_SSIZE_T_MAX ((Py_ssize_t)(((size_t)-1)>>1))

Ясно, что значение должно использовать представление числа со знаком с двумя дополнениями, чтобы эта последняя часть работала; Значение -1 сдвигается на один бит вправо, чтобы получить максимально возможное значение; в дополнении к двум -1 представлен как все 1 бит, сдвигая их вправо, вы получите 0 и все 1.

В системе кодирования этих двух дополнений это самый значимый бит (самый левый), который кодирует знак, поэтому в 64-битном числе оставляются только другие 63 бита для кодирования целочисленного значения.

Другие вопросы по тегам