Heim  >  Artikel  >  Backend-Entwicklung  >  Warum gibt fmt.Printf „-101“ für eine im Zweierkomplement dargestellte vorzeichenbehaftete Ganzzahl aus?

Warum gibt fmt.Printf „-101“ für eine im Zweierkomplement dargestellte vorzeichenbehaftete Ganzzahl aus?

DDD
DDDOriginal
2024-11-01 13:31:29208Durchsuche

Why Does fmt.Printf Output

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn