2013-06-09 15 views
8

Nel complemento a 2, 0-127 è rappresentato come 00000000 a 01111111. In caso di numeri negativi, invertiamo tutti i bit nella rappresentazione senza segno e aggiungiamo 1 per ottenere il complemento a 2.-128 e 128 in complemento a 2

(Riferimento: http://en.wikipedia.org/wiki/Signed_number_representations#Two.27s_complement)

così -1 in complemento a 2 saranno:

 

unsigned 1 =  00000001 

invert all bits = 11111110 

add 1 =   11111111 

Ma per -128, se seguiamo la stessa procedura:

 

unsigned 128 = 10000000 

invert all bits= 01111111 

add 1=   10000000 

così - 128 e 128 hanno la stessa rappresentazione nella notazione complemento a 2? Perché l'intervallo del complemento a 2 per 8 bit non è compreso tra -127 e 128? In breve, perché è preferibile -128 rispetto alla rappresentazione di unsigned 128 usando lo stesso numero di bit?

+1

'8h 'non è preferito in ogni caso. Poiché il bit più significativo è impostato, è considerato negativo, semplice e semplice. – tay10r

risposta

7

Non c'è "128" in un byte firmato. L'intervallo è

  • 0 a 127: 128 valori
  • -1 a -128: 128 valori

Totale 256 valori, cioè 2^8.

Addendum sulla base di commento (e rileggere la questione)

0x80 avrebbe potuto essere considerata come -128 o 128. Wikipedia explanation vale la pena leggere

Il complemento a due del numero minimo nella gamma non avrà l'effetto desiderato di negare il numero.

Ad esempio, il complemento a due di -128 in un sistema a 8 bit restituisce lo stesso numero binario. Questo perché un valore positivo di 128 non può essere rappresentato con un numero binario con segno a 8 bit. Si noti che questo viene rilevato come una condizione di overflow poiché vi era un carry in ma non fuori dal bit più significativo. Ciò può portare a bug inattesi in quanto un'implementazione non controllata di valore assoluto potrebbe restituire un numero negativo nel caso del minimo negativo. La famiglia abs di funzioni intere in C ha in genere questo comportamento. Questo vale anche per Java. In questo caso è lo sviluppatore a decidere se ci sarà un controllo per il minimo valore negativo prima della chiamata della funzione.

Il numero più negativo nel complemento a due viene talvolta chiamato "il numero strano", perché è l'unica eccezione. Sebbene il numero sia un'eccezione, è un numero valido nei normali sistemi a complemento di due. Tutte le operazioni aritmetiche funzionano con entrambi come operando e (a meno che non ci sia un overflow) un risultato.

Inoltre, destro spostando un intero con segno avrebbe la CPU propagare MSB (bit 7) a destra, che sarebbe contro semplice logica se 0x80 è +128, come, dopo un solo turno, avremmo ottenere 0xC0 che è un numero negativo (-64) ... (mentre un passaggio a destra da un numero positivo può, normalmente, mai produrre un risultato negativo).

6

-128 è preferito su 128, a causa della convenzione bit di segno. Nella rappresentazione numerica firmata il bit più significativo è considerato come bit di segno. Se questo bit è 1, il numero è negativo.Nella rappresentazione di 128 e -128 (10000000) questo bit è 1, quindi significa -128, non 128.

Vedi http://en.wikipedia.org/wiki/Sign_bit

+0

E anche rappresentare l'unico zero nel set con qualcosa tranne 0x0 sarebbe un po 'sciocco. – Humungus

+0

Buona spiegazione breve. Penso che questa risposta combinata con la risposta di ring0 (con il montaggio fatto da ollb) risponda alla mia domanda in modo appropriato. Upvoted. Grazie. – Karan

1

Per mantenere il MSB come il bit di segno

Problemi correlati