Почему sys.maxint == «7fffffffffffffffff»?

#python #python-2.7

#python #python-2.7

Вопрос:

 >>> import sys
>>> print '{0:64b}'.format(sys.maxint)
 111111111111111111111111111111111111111111111111111111111111111
>>> print '{0:16x}'.format(sys.maxint)
7fffffffffffffff
 

Что? Откуда взялся 7?

Это также не соответствует моему пониманию дополнения 2.

Комментарии:

1. Начальный бит — это знаковый бит, следовательно, все биты ниже установленного значения являются наибольшим допустимым целочисленным значением.

2. Это определение: 111111111111111111111111111111111111111111111111111111111111111 в двоичном формате находится 9223372036854775807 в базе 10 (десятичной) и эквивалентно 7fffffffffffffff в шестнадцатеричном.

3. Это вопрос «почему мой maxint равен 2 ^ 63-1, а не более круглому числу, такому как 2 ^ 64?», Или он спрашивает «почему шестнадцатеричное представление 2 **(4 * k 3) -1 для всех положительных целых значений k всегда начинается с 7?», или он спрашивает что-то еще?

4. 7 = 1100, как это приводит к скачку до -1?

5. Обратите внимание, что 7f = 127

Ответ №1:

Подсчитайте количество единиц в двоичном представлении. Их 63. Давайте запишем 64 бита, чтобы мы могли видеть начальный 0:

 0111111111111111111111111111111111111111111111111111111111111111
 

Это максимальное 64-разрядное целое число: 63 1 бита с 64-м битом 0. Если бы крайний левый бит был равен 1, мы бы имели -1 . О боже! Когда знаковый бит равен 1, мы получаем отрицательные числа. Это нехорошо. 64 1 — это слишком много.

Выше, в группах по 4:

 0111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111
 

И в шестнадцатеричном:

 0111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111
7    f    f    f    f    f    f    f    f    f    f    f    f    f    f    f
 

Ответ №2:

В дополнении 2 за наибольшим положительным числом, которое может быть представлено N битами 0 , следует N-1 1 ‘s. Установка всех N битов в 1 значение создает представление -1 .

Таким образом, в 64-разрядной системе максимальное целое число составляет 63 1-бит. В шестнадцатеричном 7 формате за ним последуют 7 f ‘s.

Ответ №3:

В 64-битном представлении наибольшее число, которое может быть представлено, равно 2^63-1 ,

 >>> import sys
>>> sys.maxint
9223372036854775807
>>> hex(9223372036854775807)
'0x7fffffffffffffff'
>>> (2**63)-1
9223372036854775807L
 

Это справедливо для любого N-битного представления. Например, для 8 бит максимальное значение равно 2^7-1

 >>> hex(127)
'0x7f'
>>> hex(128)
'0x80'
 

Ответ №4:

Что? Откуда взялся 7?

Результат этой строки кода:

 print '{0:64b}'.format(sys.maxint)
 

Не показывает вам начальный 0. Это действительно 0b0111111111111111111111111111111111111111111111111111111111111111 то, что 0x7fffffffffffffff

Начальный бит — это знаковый бит. Таким образом, наибольшее число, которое вы можете иметь для 64-разрядного целого числа в системе, в которой вы запускали этот код, имеет все биты ниже этого набора.