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
.
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 0xf
s 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
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
Hinzufügen zu Markiert die Antwort , wenn Sie ein anderes Ausgabeformat wünschen, verwenden Sie
'{:X}'.format(-199703103 & (2**32-1))