二补数十六进制值的符号等价形式
在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 个回答
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
的二的补码,前提是a
的bit_length()
等于你的int_size
值。int_size
值是你认为的有符号二进制数的最大位数(这里指的是a
)。
假设这个数字是有符号的,一个int_size
位的负数它的第一位(符号位)会被设置为1。因此,bit_length
将等于int_size
。