2014-03-19 1 views
2

Текущее количество миллисекунд с эпохи 1395245378429; на UNIX (64 бит/Ubuntu/питон 2.7), вы можете сделать:python обрабатывает длинные ints по-разному на Windows и Unix

>>> t = 1395245378429 
>>> type(t) 
<type 'int'> 
>>> t = 1395245378429L 
>>> type(t) 
<type 'long'> 
>>> int(t) 
1395245378429 
>>> type(int(t) 
<type 'int'> 

но на ОС Windows (также 64 бит/питон 2,7), это происходит:

>>> t = 1395245378429 
>>> type(t) 
<type 'long'> 
>>> int(t) 
1395245378429L 
>>> type(int(t)) 
<type 'long'> 

так, следующий странно наблюдения:

  • на Windows, int(<long>) возвращает длинный
  • одинаковое число трактуется как долго в Windows, но ИНТ на UNIX

Я не вижу ничего очевидного в документации, чтобы сказать, что это правильное поведение; существует (правильный) способ преобразования long в int (т. е. его можно использовать в методе, который требует аргумент int)

+0

Обходите * что *, точно? Какое последствие перехода int/long происходит в другом значении, которого вы пытаетесь избежать? – DSM

+2

Обратите внимание, что даже если у вас 64-разрядная ОС, вы все равно можете установить 32-разрядную установку Python, которая, как представляется, здесь. –

+0

Обратите внимание, что 'int (20000000000000000000)' будет возвращать 'long' в обоих python 32 и 64 бит, потому что это число больше, чем' 2 ** 64'. Преобразование из 'int' в' long' почти всегда выполняется молчаливо, так как, кроме того, выполнение операции не должно быть значительным изменением в поведении. Я не знаю ситуации, которая вызывает «OverflowError» между целыми типами. – Bakuriu

ответ

5

Python использует C long для типа int, и даже в Windows это ограничено до 32 бит. Вы можете видеть текущий максимальный родной int размера вашей платформы путем проверки sys.maxint value:

наибольшего положительного целое число, поддерживаемое регулярным целого типа Python. Это не менее 2 ** 31-1. Наибольшее отрицательное целое число равно -maxint-1 - асимметрия получается из-за использования двоичной арифметики дополнения 2.

и от Numeric Types section:

Простых чисел (также просто называемые целых числа) реализованы с использованием long в C, что дает им, по крайней мере 32 бит точности (sys.maxint всегда устанавливаются на максимальную равнину целочисленное значение для текущей платформы, минимальное значение - -sys.maxint - 1).

Если вы не непосредственно взаимодействовать с библиотекой расширения C, который не поддерживает тип Python long, нет необходимости беспокоиться о том, когда Python использует int и когда вам нужно использовать long. В Python 3 отдельный тип long был полностью удален.

+0

А, ок - я был уверен, что установил 64-битный питон, очевидно, нет! И это первый раз, когда я когда-либо сталкивался с 32-/64-разрядной проблемой, чтобы узнать ... – ChrisW

+0

Возможно, к сожалению (для меня), похоже, я использую расширение C, которое не принимает длинные, поэтому поиск этой проблемы – ChrisW

+1

Внутреннее представление Python '' использует длинный тип C. Даже в 64-битной Windows Microsoft определяет C длиной 32 бита.Поэтому не имеет значения, используете ли вы 32-разрядную или 64-разрядную версию Windows. Большинство (все?) 64-разрядных Unix-систем определяют C длиной до 64 бит. Говоря из личного опыта, разница в определении длины C вызывает множество трудностей с расширениями C. – casevh

Смежные вопросы