2016-06-02 6 views
7

So verwenden Computer Zweierkomplement, um vorzeichenbehaftete Ganzzahlen intern darzustellen. Dh -5 wird als^5 + 1 = "1111 1011" dargestellt.Golang: Zweierkomplement und fmt.Printf

Versuchen jedoch, die binäre Darstellung zu drucken, z. der folgende Code:

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

Ausgänge -101. Nicht ganz das, was ich erwarten würde. Ist die Formatierung anders oder verwendet sie nicht das Zweierkomplement?

Interessanterweise wird in dem "richtigen" Bitmuster auf ein unsigned int Ergebnisse Umwandlung:

var u uint8 = uint(i) 
fmt.Printf("%b", u) 

Ausgang ist 11111011 - genau die 2s Ergänzung von -5.

So scheint mir der Wert ist intern der wirklich mit Zwei-Komplement, aber die Formatierung druckt die unsigned 5 und eine - vor.

Kann jemand das klären?

+2

Ich bin mir nicht sicher, warum jemand dieses "komisch" hält. Egal welche Zahlenbasis Sie verwenden, eine negative Zahl ist immer noch negativ. Wenn Sie in der Basis 8, 12 oder 16 danach gefragt hätten, würde ich das Gleiche erwarten. –

+0

Nun, ich habe nicht komisch gesagt. Ich habe nur versucht, 2s Ergänzung zu verstehen und die Ergebnisse waren nicht das, was ich erwartet hatte. – joerx

+0

Ich glaube nicht, dass Sie wirklich hoffen können, das Zweierkomplement zu verstehen, indem Sie mit einer Zahlenformatierungsfunktion spielen, die in einer Hochsprache geschrieben ist. –

Antwort

5

Ich glaube, die Antwort liegt darin, wie das fmt Modul Binärzahlen formatiert, anstatt das interne Format.

Wenn Sie einen Blick auf fmt.integer, eine der ersten Maßnahmen, die die Funktion der negativen Ganzzahl mit Vorzeichen in eine positive umzuwandeln tut, ist:

165  negative := signedness == signed && a < 0 
    166  if negative { 
    167   a = -a 
    168  } 

Es gibt dann Logik - vor anhängen die Zeichenfolge, die ausgegeben wird here.

IOW -101 ist wirklich - an 5 binär angehängt.

Hinweis: fmt.integer wird von pp.fmtInt64 in print.go aufgerufen, selbst von pp.printArg in der gleichen Funktion aufgerufen.