如何在Python中将signed转换为无符号整数
假设我有这个号码i = -6884376
。 我如何引用它作为一个无符号variables? 像(unsigned long)i
在C
假设 :
- 你有2个补码表示在脑海里; 和,
- 通过
(unsigned long)
你的意思是无符号的32位整数,
那么你只需要添加2**32 (or 1 << 32)
的负值。
例如,将此应用于-1:
>>> -1 -1 >>> _ + 2**32 4294967295L >>> bin(_) '0b11111111111111111111111111111111'
假设#1意味着你想让-1被视为一个固定的1位string,假设#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
C的unsigned long
在运行此示例的框中恰好是4个字节。
要获得相当于您的C演员的价值,只需按位,并与适当的面具。 例如,如果unsigned long
是32位:
>>> i = -6884376 >>> i & 0xffffffff 4288082920
或者如果它是64位:
>>> i & 0xffffffffffffffff 18446744073702667240
尽pipe如此,虽然这给了你在C中的价值,但它仍然是一个有符号的值,所以后续的计算可能会给出一个负面的结果,你将不得不继续应用掩码来模拟32或64位计算。
Python没有内build的无符号types。 你可以使用math运算来计算一个新的 int,它代表你将在C中得到的值,但是Python int没有“unsigned value”。 Python int是一个整数值的抽象,而不是直接访问固定字节大小的整数。