二补数十六进制值的符号等价形式

2 投票
1 回答
1199 浏览
提问于 2025-04-18 15:45

在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的二的补码,前提是abit_length()等于你的int_size值。int_size值是你认为的有符号二进制数的最大位数(这里指的是a)。

假设这个数字是有符号的,一个int_size位的负数它的第一位(符号位)会被设置为1。因此,bit_length将等于int_size

撰写回答