Zweierkomplement und fmt.Printf-Binärausgabe
Wenn Computer das Zweierkomplement zur Darstellung vorzeichenbehafteter Ganzzahlen verwenden, wird ein Wert wie -5 als gespeichert das Bitmuster „1111 1011“. Wenn Sie jedoch versuchen, diese Binärdarstellung mit fmt.Printf wie folgt zu drucken:
var i int8 = -5
fmt.Printf("%b", i)
Die Ausgabe zeigt unerwartet „-101.“ Warum passiert das und wird das Zweierkomplement intern verwendet?
Das Problem mit der binären Formatierung
Die Diskrepanz liegt in der Art und Weise, wie fmt.Printf mit der binären Formatierung umgeht. Beim Formatieren einer Ganzzahl mit negativem Vorzeichen wird diese in einen positiven Wert umgewandelt und dann ein „-“-Zeichen vor der formatierten Zeichenfolge angehängt.
Ein Blick in den Quellcode von fmt.Printf stellt fest, dass fmt.integer konvertiert eine vorzeichenbehaftete Ganzzahl in einen positiven Wert umwandeln, bevor sie formatiert wird:
negative := signedness == signed && a Unsigned vs. Signed Output
Um dies zu demonstrieren, betrachten Sie diesen Code:
var u uint8 = uint(i)
fmt.Printf("%b", u)
Hier konvertieren wir i in eine vorzeichenlose Ganzzahl, bevor wir es drucken. Dieses Mal zeigt die Ausgabe korrekt „11111011“ an, was das Zweierkomplement von -5 ist.
Schlussfolgerung
So drucken Sie die binäre Darstellung einer vorzeichenbehafteten Ganzzahl korrekt mit fmt.Printf, wir sollten es zunächst mithilfe eines vorzeichenlosen Typs in eine positive Ganzzahl konvertieren. Dadurch wird sichergestellt, dass fmt.Printf den Wert nicht automatisch in einen negativen Wert umwandelt und ein „-“-Zeichen voranstellt.
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