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