„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Warum zeigt fmt.Printf eine andere Binärdarstellung für negative Ganzzahlen an als in Go erwartet?

Warum zeigt fmt.Printf eine andere Binärdarstellung für negative Ganzzahlen an als in Go erwartet?

Veröffentlicht am 08.11.2024
Durchsuche:753

Why does fmt.Printf show a different binary representation for negative integers than expected in Go?

Zweierkomplement und fmt.Printf: Das Rätsel der binären Darstellung enträtseln

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. Zum Beispiel das folgende Codefragment:

var i int8 = -5
fmt.Printf("%b", i)

gibt überraschenderweise -101 statt 1111 1011 aus. Diese Diskrepanz hat zu der Frage geführt, ob das Zweierkomplement tatsächlich 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 mit der Formatierung von fmt.Printf befassen Binärzahlen. 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 dem Zweierkomplement Konvention. 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ärdarstellungen arbeiten.

Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3