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

如何在python中将负整数值转换为十六进制,python,integer,hex,negative-number,Python,Integer,Hex,Negative Number,我使用Python2.6 >>> hex(-199703103) '-0xbe73a3f' >>> hex(199703103) '0xbe73a3f' 正负值是一样的吗 当我使用calc时,值是FFFFFFFFF418C5C1Python的整数可以任意增长。为了以您想要的方式计算原始数据,您需要指定所需的位宽度。您的示例在64位2的补码中显示了-199703103,但它也可以是32位或128位,从而在开始时产生不同数量的0xf hex()。我建议以下作为

我使用Python2.6

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

>>> hex(199703103)
'0xbe73a3f'
正负值是一样的吗


当我使用calc时,值是
FFFFFFFFF418C5C1

Python的整数可以任意增长。为了以您想要的方式计算原始数据,您需要指定所需的位宽度。您的示例在64位2的补码中显示了
-199703103
,但它也可以是32位或128位,从而在开始时产生不同数量的
0xf

hex()。我建议以下作为备选方案:

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

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

Python的整数可以任意增长。为了以您想要的方式计算原始数据,您需要指定所需的位宽度。您的示例在64位2的补码中显示了
-199703103
,但它也可以是32位或128位,从而在开始时产生不同数量的
0xf

hex()。我建议以下作为备选方案:

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

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

因为Python整数是任意大的,所以必须屏蔽这些值,以将转换限制为2s补码表示所需的位数

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

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

因为Python整数是任意大的,所以必须屏蔽这些值,以将转换限制为2s补码表示所需的位数

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

FFF...FFFFFFFFFFFFFFFFFFFFFFFFF418c5c1
&                             FFFFFFFF
--------------------------------------
                              F418c5c1
添加到,如果需要不同的输出格式,请使用

'{:X}'.format(-199703103 & (2**32-1))
添加到,如果需要不同的输出格式,请使用

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

请您解释一下添加
(1@jathanism,值
(1我认为此实现中存在错误:tohex(-129,8)返回0x7f,这是不可能的,因为8位有符号整数只能存储(-1)*(2^7)中的数字=-128到2^7-1=127。因此,函数应该在返回之前检查val是否在该范围内,如果不在,则引发异常(或其他情况)。这可以使代码更加健壮,我认为:)请解释一下添加
(1@jathanism,值
(1我认为这个实现中存在一个错误:tohex(-129,8)返回0x7f,这是不可能的,因为8位有符号整数只能存储从(-1)*(2^7)=-128到2^7-1=127的数字。因此函数应该在返回之前检查val是否在这个范围内,如果不在,则引发异常(或其他)。这可以使代码更加健壮,我认为:)虽然简洁,但与位操作相比,提高到一个功耗不是很昂贵吗?@swdev,
py-m timeit“2**32-1”
->0.0235 usec/循环,
py-m timeit”2操作,使其成为
(1同样,如果您非常关心计时,
2**32-1
只需将常量
0xFFFFFFFF
用于32位,将
0xFFFFFFFFFFFF
用于64位。或
掩码\u 32位=(2**32-1)
这样你就不必每次计算一次,只需计算一次。@busfault每个注释的速度与此相同。Python在生成字节码时只计算一次常量。无需“优化”。虽然简洁,但与位操作相比,提高功率不是很昂贵吗?@swdev,
py-m timeit“2**32-1“
->0.0235 usec per loop,
py-m timeit”2操作,使其
(1您也可以,包括
2**32-1
对32位使用常量
0xFFFFFFFF
,对64位使用
0xffffffffffff
,如果您关心计时的话。或者
mask\u 32位=(2**32-1)
这样您就不必每次计算一次,只需计算一次。@busfault每个注释的速度与上述速度没有区别。Python在生成字节码时只计算一次常量。无需“优化”。