Rappresentazione binaria in Turbo C
Domanda
Ho una query molto semplice. Per il seguente codice:
int i = -1;
unsigned int j = (unsigned int) i;
printf("%d",j); // I get 65535 the int limit in turbo C 16 bit compiler
.
Non dovrebbe semplicemente rilasciare il segno negativo o si avvolge i limiti?
Soluzione
Lo schema più comunemente usato per rappresentare numeri negativi è chiamato Complemento di due .In questo schema -1
ha il modello di bit di tutti i bit 1
: 1111 1111 1111 1111
.Quando interpretato come un intero non firmato, che è ciò che significa il tuo cast, è 65535.
In altre parole, lo fa "semplicemente rilascia il segno negativo", tranne per questo farlo ha un effetto diverso da quello che ti aspetti.
Altri suggerimenti
Quando si converti un int
in unsigned int
, se il valore è negativo, il risultato è come se tale valore negativo è stato aggiunto al numero uno più grande di quello che può contenere un unsigned int
.Ciò è specificato dallo standard C dal C90 e detiene indipendentemente dal fatto che la macchina utilizzi il complemento di due, il proprio complemento o le rappresentazioni di grandezza firmata.