cómo convertir un valor entero negativo a hex en python
integer negative-number (4)
Yo uso python 2.6
>>> hex(-199703103)
''-0xbe73a3f''
>>> hex(199703103)
''0xbe73a3f''
Valor positivo y negativo son los mismos?
Cuando uso calc, el valor es FFFFFFFFF418C5C1
.
Agregando a la respuesta de Marks , si desea un formato de salida diferente, use
''{:X}''.format(-199703103 & (2**32-1))
Debido a que los enteros de Python son arbitrariamente grandes, debe enmascarar los valores para limitar la conversión al número de bits que desea para su representación de complemento 2s.
>>> hex(-199703103 & (2**32-1)) # 32-bit
''0xf418c5c1L''
>>> hex(-199703103 & (2**64-1)) # 64-bit
''0xfffffffff418c5c1L''
Python muestra el caso simple de hex(-199703103)
como un valor hexadecimal negativo ( -0xbe73a3f
) porque la representación del complemento 2s tendría un número infinito de Fs delante de él para un número de precisión arbitrario. El valor de la máscara (2 ** 32-1 == 0xFFFFFFFF) limita esto:
FFF...FFFFFFFFFFFFFFFFFFFFFFFFF418c5c1
& FFFFFFFF
--------------------------------------
F418c5c1
Los enteros de Python pueden crecer arbitrariamente grandes. Para calcular el two''s-complement bruto two''s-complement la forma que lo desee, deberá especificar el ancho de bit deseado. Su ejemplo muestra -199703103
en el complemento de dos bits de 64 bits, pero igualmente podría haber sido de 32 bits o de 128 bits, lo que dio como resultado un número diferente de 0xf
''s al comienzo.
hex()
no hace eso. Sugiero lo siguiente como alternativa:
def tohex(val, nbits):
return hex((val + (1 << nbits)) % (1 << nbits))
print tohex(-199703103, 64)
print tohex(199703103, 64)
Esto imprime:
0xfffffffff418c5c1L
0xbe73a3fL
>>> import struct
>>> struct.pack("i", -4)
''/xfc/xff/xff/xff''