Почему 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 бита для кодирования целочисленного значения.