2013-12-24 2 views
42

Предположим, у меня есть этот номер i = -6884376. Как я могу ссылаться на него как на неподписанную переменную? Что-то вроде (unsigned long)i в C.Как конвертировать подписанное целое без знака в python

+8

Python не имеет встроенных неподписанных типов. – BrenBarn

+1

вы можете использовать функцию abs(). –

+0

Возможно, вы можете что-то сделать с библиотекой 'struct', но, как сказал BrenBarn; Python не разделяет подпись. –

ответ

56

Предполагая:

  1. Вы 2's-комплемент представление в виде; и,
  2. По (unsigned long) вы значит беззнаковое 32-разрядное целое число,

то вам просто нужно добавить 2**32 (or 1 << 32) к отрицательному значению.

Например, применить это к -1:

>>> -1 
-1 
>>> _ + 2**32 
4294967295L 
>>> bin(_) 
'0b11111111111111111111111111111111' 

Допущение # 1 означает, что вы хотите -1 следует рассматривать как сплошную череду 1 бит, и предположение, # 2 означает, что вы хотите, 32 из них.

Никто, кроме вас, не может сказать, каковы ваши скрытые предположения. Если, например, у вас есть представления с 1'-дополнением, тогда вам нужно применить вместо этого префикс ~. Целые числа Python усердно работают, чтобы создать иллюзию использования бесконечно широкого представления дополнений 2 (например, регулярное дополнение 2, но с бесконечным числом «битов знака»).

И дублировать то, что делает платформу C компилятор, вы можете использовать модуль ctypes:

>>> import ctypes 
>>> ctypes.c_ulong(-1) # stuff Python's -1 into a C unsigned long 
c_ulong(4294967295L) 
>>> _.value 
4294967295L 

Кассиопеян unsigned long случается 4 байта на поле, который бежал этот образец.

11

Python не имеет встроенных неподписанных типов. Вы можете использовать математические операции для вычисления нового int, представляющего значение, которое вы получите на C, но нет никакого значения без знака для Python int. Python int представляет собой абстракцию целочисленного значения, а не прямой доступ к целому числу с фиксированным байтом.

38

Чтобы получить значение, эквивалентное вашему C, просто побитовое и с соответствующей маской. например если unsigned long 32 бит:

>>> i = -6884376 
>>> i & 0xffffffff 
4288082920 

или, если это 64 бит:

>>> i & 0xffffffffffffffff 
18446744073702667240 

ли иметь в виду, однако, что несмотря на то, что дает вам значение будет иметь в С, он по-прежнему подписано значение , поэтому любые последующие вычисления могут дать отрицательный результат, и вам придется продолжать применять маску для имитации вычисления 32 или 64 бит.

+0

+ One: Simple , нет импорта –