python integer hex negative-number

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''