webentwicklung-frage-antwort-db.com.de

wie man einen negativen Integer-Wert in Python in Hex umwandelt

Ich benutze Python 2.6

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

>>> hex(199703103)
'0xbe73a3f'

Positiver und negativer Wert sind gleich?

Wenn ich calc benutze, ist der Wert FFFFFFFFF418C5C1.

20
nic nic

Pythons ganze Zahlen können beliebig groß werden. Um das rohe Zweierkomplement so zu berechnen, wie Sie es möchten, müssen Sie die gewünschte Bitbreite angeben. Ihr Beispiel zeigt -199703103 im 64-Bit-Zweierkomplement, aber es könnte genauso gut 32-Bit oder 128-Bit sein, was zu einer anderen Anzahl von 0xfs am Anfang führt.

hex() macht das nicht. Als Alternative schlage ich vor:

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

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

Dies druckt aus:

0xfffffffff418c5c1L
0xbe73a3fL
39
NPE

Da Python-Ganzzahlen beliebig groß sind, müssen Sie die Werte maskieren, um die Konvertierung auf die Anzahl der Bits zu beschränken, die Sie für Ihre 2s-Komplementdarstellung benötigen.

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

Python zeigt den einfachen Fall von hex(-199703103) als negativen Hex-Wert (-0xbe73a3f) an, da die 2s-Komplement-Darstellung eine unendliche Anzahl von Fs vor sich hätte, um eine beliebige Genauigkeitszahl zu erhalten. Der Maskenwert (2 ** 32-1 == 0xFFFFFFFF) begrenzt dies:

FFF...FFFFFFFFFFFFFFFFFFFFFFFFF418c5c1
&                             FFFFFFFF
--------------------------------------
                              F418c5c1
9
Mark Tolonen

Hinzufügen zu Markiert die Antwort , wenn Sie ein anderes Ausgabeformat wünschen, verwenden Sie

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