2016-06-02 41 views
7

Così i computer utilizzano il complemento a due per rappresentare internamente interi con segno. I.e, -5 è rappresentato come^5 + 1 = "1111 1011".Golang: complemento a due e fmt.Printf

Tuttavia, provare a stampare la rappresentazione binaria, ad es. il seguente codice:

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

Uscite -101. Non proprio quello che mi aspetterei. La formattazione è diversa o non usa il complemento di Due, dopo tutto?

È interessante notare che la conversione in un unsigned int risultati nella stringa di bit "corretto":

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

uscita è 11111011 - esattamente il complemento 2s di -5.

Quindi mi sembra che il valore sia internamente l'utilizzo del complemento a due, ma la formattazione è la stampa del 5 senza firma e la preposizione di -.

Qualcuno può chiarirlo?

+2

Non so perché qualcuno lo consideri "strano". Indipendentemente dalla base numerica utilizzata, un numero negativo è ancora negativo. Se lo chiedeste nella base 8, 12 o 16 mi aspetterei la stessa cosa. –

+0

Beh, non ho detto strano. Stavo solo cercando di capire il complemento a 2 e i risultati non erano quello che mi aspettavo. – joerx

+0

Non penso che tu possa davvero sperare di capire il complemento di 2 giocando con una funzione di formattazione dei numeri scritta in un linguaggio di alto livello. –

risposta

5

Credo che la risposta risieda in come il modulo fmt formatta i numeri binari, piuttosto che il formato interno.

Se si dà un'occhiata a fmt.integer, una delle prime azioni che la funzione non è quella di convertire il numero intero negativo con segno positivo per uno:

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

C'è poi la logica di aggiungere - davanti la stringa che viene emessa here.

IOW -101 è in realtà - aggiunto a 5 in binario.

Nota: fmt.integer viene chiamato da pp.fmtInt64 in print.go, chiamato da pp.printArg nella stessa funzione.