如何在Python中将负整数值转换为十六进制

发布于 2024-12-10 18:50:46 字数 203 浏览 0 评论 0原文

我使用 python 2.6

>>> hex(-199703103)
'-0xbe73a3f'

>>> hex(199703103)
'0xbe73a3f'

正值和负值相同吗?

当我使用 calc 时,该值为 FFFFFFFFF418C5C1

I use python 2.6

>>> hex(-199703103)
'-0xbe73a3f'

>>> hex(199703103)
'0xbe73a3f'

Positive and negative value are the same?

When I use calc, the value is FFFFFFFFF418C5C1.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

荆棘i 2024-12-17 18:50:46

Python 的整数可以任意增大。为了按照您想要的方式计算原始二进制补码,您需要指定所需的位宽度。您的示例以 64 位二进制补码显示 -199703103,但它也可能是 32 位或 128 位,从而导致不同数量的 0xf' s 开头。

hex() 不会这样做。我建议使用以下替代方案:

def tohex(val, nbits):
  return hex((val + (1 << nbits)) % (1 << nbits))

print tohex(-199703103, 64)
print tohex(199703103, 64)

打印出:

0xfffffffff418c5c1L
0xbe73a3fL

Python's integers can grow arbitrarily large. In order to compute the raw two's-complement the way you want it, you would need to specify the desired bit width. Your example shows -199703103 in 64-bit two's complement, but it just as well could have been 32-bit or 128-bit, resulting in a different number of 0xf's at the start.

hex() doesn't do that. I suggest the following as an alternative:

def tohex(val, nbits):
  return hex((val + (1 << nbits)) % (1 << nbits))

print tohex(-199703103, 64)
print tohex(199703103, 64)

This prints out:

0xfffffffff418c5c1L
0xbe73a3fL
南城追梦 2024-12-17 18:50:46

由于 Python 整数是任意大的,因此您必须对这些值进行屏蔽,以将转换限制为 2 补码表示所需的位数。

>>> hex(-199703103 & (2**32-1)) # 32-bit
'0xf418c5c1L'
>>> hex(-199703103 & (2**64-1)) # 64-bit
'0xfffffffff418c5c1L'

Python 将 hex(-199703103) 的简单情况显示为负十六进制值 (-0xbe73a3f),因为 2s 补码表示形式前面会有无数个 F对于任意精度数。掩码值 (2**32-1 == 0xFFFFFFFF) 限制了这一点:

FFF...FFFFFFFFFFFFFFFFFFFFFFFFF418c5c1
&                             FFFFFFFF
--------------------------------------
                              F418c5c1

Because Python integers are arbitrarily large, you have to mask the values to limit conversion to the number of bits you want for your 2s complement representation.

>>> hex(-199703103 & (2**32-1)) # 32-bit
'0xf418c5c1L'
>>> hex(-199703103 & (2**64-1)) # 64-bit
'0xfffffffff418c5c1L'

Python displays the simple case of hex(-199703103) as a negative hex value (-0xbe73a3f) because the 2s complement representation would have an infinite number of Fs in front of it for an arbitrary precision number. The mask value (2**32-1 == 0xFFFFFFFF) limits this:

FFF...FFFFFFFFFFFFFFFFFFFFFFFFF418c5c1
&                             FFFFFFFF
--------------------------------------
                              F418c5c1
云雾 2024-12-17 18:50:46

添加到 标记答案,如果您想要不同的输出格式,请使用

'{:X}'.format(-199703103 & (2**32-1))

Adding to Marks answer, if you want a different output format, use

'{:X}'.format(-199703103 & (2**32-1))
萌辣 2024-12-17 18:50:46

对于那些想要正数前导零的人,请尝试以下操作:

val = 42
nbits = 16
'{:04X}'.format(val & ((1 << nbits)-1))

在此处输入图像描述

感谢@tm1 的灵感!

For those who want leading zeros for positive numbers, try this:

val = 42
nbits = 16
'{:04X}'.format(val & ((1 << nbits)-1))

enter image description here

Thanks @tm1, for the inspiration!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文