Python 2'的签名等价物;s补码十六进制值
在python终端上执行以下操作时:-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); } 你们可以用图书馆来做这件事 您也
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