如何在Python中将signed转换为无符号整数

假设我有这个号码i = -6884376 。 我如何引用它作为一个无符号variables? 像(unsigned long)i在C

假设

  1. 你有2个补码表示在脑海里; 和,
  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是一个整数值的抽象,而不是直接访问固定字节大小的整数。