Вы найдете это
xrange(1 << 31 - 1)
- последний, который ведет себя так, как вы хотите. Это связано с тем, что максимальное знаковое (32-разрядное) целое число составляет 2 ^ 31 - 1.
1 << 32
не является 32-разрядным целым числом с положительным знаком (тип Python int
), поэтому вы получаете эту ошибку.
В Python 2.6 я даже не могу сделать xrange(1 << 32)
или xrange(1 << 31)
, не получив ошибку, а тем более len
в результате.
Редактировать Если вы хотите немного больше деталей ...
1 << 31
представляет число 0x80000000, которое в представлении дополнения 2 является наименьшим представимым отрицательным числом (-1 * 2 ^ 31) для 32-разрядного int
. Так что да, из-за побитового представления чисел, с которыми вы работаете, оно на самом деле становится отрицательным.
Для 32-битного номера дополнения до 2 0x7FFFFFFF является наибольшим представимым целым числом (2 ^ 31 - 1) перед тем, как вы «переполнитесь» на отрицательные числа.
Дополнительная информация , если вам интересно.
Обратите внимание, что когда вы видите в приглашении что-то вроде 2147483648L, буква "L" в конце означает, что теперь она представляется как "длинное целое число" (обычно 64 бита, я не могу дать никаких обещаний о том, как Python обрабатывает это, потому что я не читал об этом).