Специфична ли архитектура python int?


Мы можем определить переменные как целочисленные значения, например

x = 3
y = -2

И затем оперировать битами с бинарными операторами &, |, ^ и ~. Вопрос в том, всегда ли мы получаем один и тот же результат на каждой архитектуре, или архитектура поведения специфична? Можем ли мы всегда предполагать, что два дополняют представление целых чисел?

2 2

2 ответа:

Из документации python 2 (Курсив мой):

Простые целые числа: они представляют собой числа в диапазоне от -2147483648 до 2147483647. (диапазон может быть больше на машинах с большим натуральным размером слова, но не меньше.) когда результат операции выходит за пределы этого диапазона, результат обычно возвращается в виде длинного целого числа (в некоторых случаях вместо этого возникает исключение OverflowError). С целью сдвига и маски предполагается, что операции, целые числа имеют двоичную, дополняющую нотацию 2, использующую 32 или более бита и не скрывающую бит от пользователя (т. е. все 4294967296 различных битовых шаблонов соответствуют различным значениям).

Так что да: целые числа являются специфичной архитектурой для Python 2.

Из документации Python 3 :

Простые целые числа: они представляют собой числа в неограниченном диапазоне, при условии наличия только виртуальной памяти. С целью: операции сдвига и маски, предполагается двоичное представление, и отрицательные числа представлены в варианте дополнения 2, которое дает иллюзию бесконечной строки знаковых битов, простирающихся влево.

Так что нет: целые числа не являются специфичной архитектурой для Python 3.

Python 2.x поддерживает два целочисленных типа: int и long. int основан на базовом типе C long и long является типом произвольной точности. Очень ранняя версия Python (pre-2.2), рассматривала типы как два отдельных типа, но они были в основном объединены в Python 2.2. Питон 3.x использует только произвольный тип точности.

Битовые операции ведут себя так, как если бы они применялись к числам дополнения произвольной точности 2. При необходимости int будет автоматически повышен до long в Python 2.x.

Поведение непротиворечиво на разных платформах.