Python 2'的签名等价物;s补码十六进制值

Python 2'的签名等价物;s补码十六进制值,python,c,signed,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); } 你们可以用图书馆来做这件事 您也

在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); }
你们可以用图书馆来做这件事

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

如果没有外部/内部库,您可以执行以下操作:

int_size = 32
a = 0xffffff85
a = (a ^ int('1'*a.bit_length())) + 1 if a.bit_length() == int_size else a
如果数字
a
bit\u length()
等于您的
int\u size
值,则取数字
a
的2的补码
int_size
值是有符号二进制数的最大位长度[此处
a
]


假设数字是有符号的,
int\u size
位负数的第一位(符号位)将设置为1。因此,
位长度
将等于
int\u大小

如果不小于2的(位长度-1)幂,则减去2的位长度幂。容易的。(本例中的位长度为32)
intx=0xffff85;printf(“%d\n”,x)不是用于打印“-123”的可移植C代码。这取决于
unsigned
int
的位宽以及底层
int
实现(2的补码与否)。C代码是UB。下面是另一个集合:
import struct;结构解包('i',结构包('i',0xffffff85))[0]
>>> 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