Предположим, у меня есть этот номер i = -6884376
. Как я могу ссылаться на него как на неподписанную переменную? Что-то вроде (unsigned long)i
в C.Как конвертировать подписанное целое без знака в python
ответ
Предполагая:
- Вы 2's-комплемент представление в виде; и,
- По
(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 байта на поле, который бежал этот образец.
Python не имеет встроенных неподписанных типов. Вы можете использовать математические операции для вычисления нового int, представляющего значение, которое вы получите на C, но нет никакого значения без знака для Python int. Python int представляет собой абстракцию целочисленного значения, а не прямой доступ к целому числу с фиксированным байтом.
Чтобы получить значение, эквивалентное вашему C, просто побитовое и с соответствующей маской. например если unsigned long
32 бит:
>>> i = -6884376
>>> i & 0xffffffff
4288082920
или, если это 64 бит:
>>> i & 0xffffffffffffffff
18446744073702667240
ли иметь в виду, однако, что несмотря на то, что дает вам значение будет иметь в С, он по-прежнему подписано значение , поэтому любые последующие вычисления могут дать отрицательный результат, и вам придется продолжать применять маску для имитации вычисления 32 или 64 бит.
+ One: Simple , нет импорта –
Python не имеет встроенных неподписанных типов. – BrenBarn
вы можете использовать функцию abs(). –
Возможно, вы можете что-то сделать с библиотекой 'struct', но, как сказал BrenBarn; Python не разделяет подпись. –