Widersprüchliche hexadezimale Formatierung in Go und C: Vorzeichen- und vorzeichenlose Ganzzahlen verstehen
In der Welt der Programmierung kann die Formatierung ganzzahliger Werte manchmal zu Überraschungen führen. Ein solcher Fall tritt auf, wenn 64-Bit-Ganzzahlen als hexadezimale Abweichungen in Go und C gedruckt werden.
Das Problem
Wie das Beispiel zeigt, wird der Formatbezeichner %x verwendet Der ganzzahlige Wert -1 in Go ergibt „-1“, während in C die erwartete Ausgabe „ffffffffffffffff“ wäre. Diese Diskrepanz ergibt sich aus dem grundlegenden Unterschied in der Art und Weise, wie Go und C mit vorzeichenbehafteten und vorzeichenlosen Ganzzahlen umgehen.
Gos Ansatz
Go hält sich strikt an die Typsicherheit. Beim Formatieren eines ganzzahligen Werts wird dieser standardmäßig als vorzeichenbehaftete Ganzzahl dargestellt, auch wenn der Eingabewert die negative Darstellung einer großen vorzeichenlosen Ganzzahl ist. Der %x-Formatbezeichner in Go formatiert den numerischen Wert und nicht seine Speicherdarstellung.
C-Ansatz
Im Gegensatz dazu erzwingt C keine strikte Typsicherheit. Die %x-Konvertierung in C formatiert normalerweise die Speicherdarstellung des Ganzzahlwerts, der im Fall einer negativen Ganzzahl als positive Ganzzahl ohne Vorzeichen mit äquivalenten Bits interpretiert wird.
Die Lösung in Go
Um das gewünschte Verhalten in Go zu erreichen, ist es notwendig, die vorzeichenbehaftete Ganzzahl explizit in eine vorzeichenlose Ganzzahl umzuwandeln, bevor der Formatbezeichner %x angewendet wird. Dies kann mit der uint-Typumwandlung erfolgen:
fmt.Printf("%d %x %d %x", -1, -1, uint(-1), uint(-1))
Ausgabe:
-1 -1 18446744073709551615 ffffffffffffffff
Rob Pikes Argumentation
Das Standardverhalten der Darstellung Negative Zahlen in ihrer vorzeichenbehafteten Form in Go zu verwenden, war eine bewusste Entscheidung von Rob Pike. Seine Begründung war, dass es kürzere Darstellungen negativer Zahlen ermöglicht und sicherstellt, dass alle Ganzzahlformatspezifizierer (%b, %o, %d, %x) ihre Argumente konsistent behandeln.
Das obige ist der detaillierte Inhalt vonWarum unterscheidet sich das Format „%x' für -1 in Go und C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!