Qual è la differenza tra int signed e unsigned

Qual è la differenza tra int signed e unsigned?

A volte sappiamo in anticipo che il valore memorizzato in una determinata variabile intera sarà sempre positivo, quando viene usato per contare solo le cose, per esempio. In tal caso, possiamo dichiarare la variabile come non firmata, come in, unsigned int num student; . Con una tale dichiarazione, l’intervallo di valori interi consentiti (per un compilatore a 32 bit) passerà dall’intervallo -2147483648 a +2147483647 nell’intervallo da 0 a 4294967295. Pertanto, dichiarando un numero intero come non firmato quasi si raddoppia la dimensione del più grande ansible valore che altrimenti può contenere.

int e unsigned int sono due tipi interi distinti. ( int può anche essere indicato come signed int , o semplicemente signed , unsigned int può anche essere indicato come unsigned .)

Come i nomi implicano, int è un tipo intero con unsigned int e unsigned int è un tipo intero senza segno . Ciò significa che int è in grado di rappresentare valori negativi e unsigned int può rappresentare solo valori non negativi.

Il linguaggio C impone alcuni requisiti sulle gamme di questi tipi. L’intervallo di int deve essere almeno -32767 .. -32767 e l’intervallo di unsigned int deve essere almeno 0 .. 65535 . Ciò implica che entrambi i tipi devono essere almeno 16 bit. Sono 32 bit su molti sistemi, o anche 64 bit su alcuni. int ha tipicamente un valore extra negativo a causa della rappresentazione a due complementi usata dalla maggior parte dei sistemi moderni.

Forse la differenza più importante è il comportamento dell’aritmetica firmata vs. non firmata. Per l’ int firmato, l’overflow ha un comportamento non definito. Per unsigned int , non c’è overflow; qualsiasi operazione che restituisce un valore al di fuori dell’intervallo del tipo, ad esempio, UINT_MAX + 1 == 0 .

Qualsiasi tipo intero, firmato o non firmato, modella un subrange del set infinito di numeri interi matematici. Finché lavori con valori compresi nell’intervallo di un tipo, tutto funziona. Quando ti avvicini al limite inferiore o superiore di un tipo, incontri una discontinuità e puoi ottenere risultati imprevisti. Per i tipi di interi con INT_MIN , i problemi si verificano solo per valori negativi e positivi molto grandi, superiori a INT_MIN e INT_MAX . Per i tipi interi senza segno, i problemi si verificano per valori positivi molto grandi e a zero . Questo può essere una fonte di bug. Ad esempio, questo è un ciclo infinito:

 for (unsigned int i = 10; i >= 0; i --) [ printf("%u\n", i); } 

perché i è sempre maggiore o uguale a zero; questa è la natura dei tipi non firmati. (All’interno del ciclo, quando i è zero, i-- imposta il suo valore su UINT_MAX .)

Nei termini dei laici un int unsigned è un numero intero che non può essere negativo e quindi ha una gamma più alta di valori positivi che può assumere. Un int firmato è un numero intero che può essere negativo ma ha un intervallo positivo più basso in cambio di più valori negativi che può assumere.