Heim >Backend-Entwicklung >Golang >Warum führt die hexadezimale Ausgabe von -1 in Go und C zu unterschiedlichen Ergebnissen?
Verstehen der Unterschiede beim Hexadezimaldruck zwischen Go und C: Der Fall von -1
In Go repräsentiert das %x-Format zum Drucken von Ganzzahlen das Wert in hexadezimaler Schreibweise. Dies unterscheidet sich von Cs %x, das die Speicherdarstellung einer vorzeichenbehafteten Ganzzahl ausgibt. Dieser Unterschied führt zu unerwarteten Ergebnissen beim Drucken der negativen Ganzzahl -1.
In Go:
var x uint64 = 1 << 64 - 1 fmt.Printf("%x\n", x)
Ausgabe:
ffffffffffffffffffff
Hier gibt %x korrekt aus Hexadezimale Darstellung des vorzeichenlosen Werts 1<<64 - 1.
In C:
#include <stdio.h> int main() { uint64_t x = 1LL << 64 - 1; printf("%x\n", (long long)x); }
Ausgabe:
-1
In C gibt %x den aus Ganzzahlwert mit Vorzeichen -1, was scheinbar zu einer negativen Hexadezimalzahl mit einem führenden „-“ führt. Dies ist jedoch nicht der Fall; Das „-“-Zeichen zeigt an, dass die Ganzzahl negativ ist, und der Hexadezimalwert ffff...ff ist die Zweierkomplementdarstellung von -1.
Go erzwingt eine strikte Typisierung und erfordert explizite Typkonvertierungen, um vorzeichenbehaftete Ganzzahlen als zu behandeln ohne Vorzeichen. So geben Sie -1 als vorzeichenlosen Wert in Go aus:
i := -1 // type int fmt.Printf("%x", uint(i))
Ausgabe:
ffffffff
Dieser Ansatz wandelt die vorzeichenbehaftete Ganzzahl -1 in ihr vorzeichenloses Gegenstück um, was zur korrekten hexadezimalen Darstellung führt .
Das Standardverhalten von Go zum Drucken negativer Ganzzahlen als vorzeichenbehaftete Werte ermöglicht eine prägnante Darstellung, kann jedoch in hexadezimalen Kontexten zu unerwarteten Ergebnissen führen. Das Verständnis dieser Unterschiede ist entscheidend für das effektive Schreiben von Code in Go.
Das obige ist der detaillierte Inhalt vonWarum führt die hexadezimale Ausgabe von -1 in Go und C zu unterschiedlichen Ergebnissen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!