Heim > Artikel > Backend-Entwicklung > Warum zeigt fmt.Printf eine andere Binärdarstellung für negative Ganzzahlen an als in Go erwartet?
Zweierkomplement und fmt.Printf: Das Rätsel der binären Darstellung lösen
Bei der Arbeit mit vorzeichenbehafteten ganzen Zahlen verwenden Computer das Zweierkomplement, um negative Werte darzustellen . Dies unterscheidet sich von der typischen binären Darstellung, bei der das Vorzeichen durch ein separates Bit angegeben wird. Beispielsweise wird im Zweierkomplement die Ganzzahl -5 als 1111 1011 dargestellt.
Das Drucken der Binärdarstellung mit fmt.Printf kann jedoch zu unerwarteten Ergebnissen führen. Beispielsweise gibt das folgende Codefragment:
var i int8 = -5 fmt.Printf("%b", i)
überraschenderweise -101 statt 1111 1011 aus. Diese Diskrepanz hat zu der Frage geführt, ob das Zweierkomplement wirklich für die interne Darstellung verwendet wird oder ob die Formatierung unklar ist die richtige Darstellung.
Um Licht in diese Angelegenheit zu bringen, müssen wir uns damit befassen, wie fmt.Printf Binärzahlen formatiert. Der Übeltäter liegt in der Funktion fmt.integer, die negative vorzeichenbehaftete Ganzzahlen automatisch in positive umwandelt. Bei dieser Konvertierung wird die Ganzzahl negiert und der Ausgabezeichenfolge ein --Zeichen vorangestellt. Somit ist die Ausgabe von -101 eine Darstellung von -, angehängt an die binäre Darstellung von 5.
Um dies weiter zu demonstrieren, erzeugt die Konvertierung der vorzeichenbehafteten Ganzzahl in eine vorzeichenlose Ganzzahl und deren anschließende Formatierung mit fmt.Printf die korrekten Zweier Komplementdarstellung:
var u uint8 = uint(i) fmt.Printf("%b", u)
Dies gibt 11111011 aus, genau das Zweierkomplement von -5.
Daher folgt die interne Darstellung vorzeichenbehafteter Ganzzahlen in Go der Zweierkomplementkonvention. Die scheinbar falsche binäre Darstellung beim Formatieren von vorzeichenbehafteten Ganzzahlen resultiert aus der automatischen Konvertierung und dem Vorzeichenvoranstellen durch fmt.integer. Das Verständnis dieses Verhaltens ist wichtig, wenn Sie in Go mit vorzeichenbehafteten Ganzzahlen und binären Darstellungen arbeiten.
Das obige ist der detaillierte Inhalt vonWarum zeigt fmt.Printf eine andere Binärdarstellung für negative Ganzzahlen an als in Go erwartet?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!