签名相当于2的补码十六进制值

时间:2014-08-02 15:47:19

标签: python c signed

当我这样做时在python终端上: -

In [6]: 0xffffff85
Out[6]: 4294967173

In [9]: "%d" %(0xffffff85)
Out[9]: '4294967173'

我希望能够提供0xffffff85并获得python中签名的等效十进制数(在本例中为-123)。我怎么能这样做?

在C中,我可以这样做: -

int main() { int x = 0xffffff85; printf("%d\n", x); }

1 个答案:

答案 0 :(得分:3)

您可以使用ctypes库。

>>> import ctypes
>>> ctypes.c_int32(0xffffff85).value
-123

您也可以使用bitstring库执行相同操作。

>>> from bitstring import BitArray
>>> BitArray(uint = 0xffffff85, length = 32).int
-123L

如果没有外部/内部库,您可以这样做:

int_size = 32
a = 0xffffff85
a = (a ^ int('1'*a.bit_length())) + 1 if a.bit_length() == int_size else a

如果数字a的{​​{1}}等于您的bit_length()值,则会获得数字a的2的补码。 int_size值是您签名二进制数[[int_size]的最大位长。

假设数字已签名,a位负数将使其第一位(符号位)设置为1.因此int_size将等于bit_length