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:
<code class="go">var i int8 = -5 fmt.Printf("%b", i)</code>
Die Ausgabe zeigt unerwartet „-101.“ Warum passiert das und wird das Zweierkomplement intern verwendet?
Das Problem mit der Binärformatierung
Die Diskrepanz liegt in der Art und Weise, wie fmt.Printf mit der Binärformatierung 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.
Wenn wir uns den Quellcode von fmt.Printf ansehen, stellen wir fest, dass fmt.integer konvertiert eine vorzeichenbehaftete Ganzzahl in einen positiven Wert umwandeln, bevor Sie sie formatieren:
<code class="go"> negative := signedness == signed && a < 0 if negative { a = -a }</code>
Unsigned vs. Signed Ausgabe
Um dies zu demonstrieren, betrachten Sie diesen Code:
<code class="go">var u uint8 = uint(i) fmt.Printf("%b", u)</code>
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.
Fazit
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.
Das obige ist der detaillierte Inhalt vonWarum gibt fmt.Printf „-101' für eine im Zweierkomplement dargestellte vorzeichenbehaftete Ganzzahl aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!