【问题标题】:Signed equivalent of a 2's complement hex value2 的补码十六进制值的有符号等价物
【发布时间】:2014-09-25 15:10:58
【问题描述】:

当我这样做时在 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); }

【问题讨论】:

  • 如果不小于 2 的 (bitlength-1) 次方,则减去 2 的 bitlength 次方。简单。 (本例中的位长为 32)
  • int x = 0xffffff85; printf("%d\n", x); 不是用于打印“-123”的可移植 C 代码。这取决于unsignedint 的位宽和底层int 实现(是否是2 的补码。)C 代码是UB。

标签: python c signed


【解决方案1】:

您可以使用 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

如果数字abit_length() 等于您的int_size 值,则这将取数字a 的2 的补码。 int_size 值是您作为带符号二进制数的最大位长度的值 [此处为 a ]。

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

【讨论】:

  • 这是您收藏的另一个:import struct; struct.unpack('i', struct.pack('I', 0xffffff85))[0]
猜你喜欢
  • 2014-11-03
  • 1970-01-01
  • 2013-02-02
  • 1970-01-01
  • 2011-09-03
  • 2021-01-23
  • 1970-01-01
  • 2017-01-02
  • 2011-10-05
相关资源
最近更新 更多