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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top