Assegnare un int -1
a un unsigned
: Come -1
non rientra in il range [0...UINT_MAX]
, multipli di UINT_MAX+1
vengono aggiunti fino a quando la risposta è nell'intervallo.Evidentemente UINT_MAX
è pow(2,32)-1 or 429496725
sulla macchina dell'OP, quindi a
ha il valore di .
unsigned int a = -1;
Il "%x"
, "%u"
specificatore aspetta una corrispondenza unsigned
. Poiché questi non corrispondono, "Se una specifica di conversione non è valida, il comportamento non è definito. Se un argomento non è il tipo corretto per la specifica di conversione corrispondente, il comportamento non è definito." C11 §7.21.6.1 9. Lo specificatore printf non cambia b
.
printf("%x\n", b); // UB
printf("%u\n", b); // UB
Il "%d"
specificatore aspetta una corrispondenza int
. Poiché questi non corrispondono, più UB.
printf("%d\n", a); // UB
Dato un comportamento indefinito, le conclusioni non sono supportate.
entrambi i casi, i byte sono uguali (ffffffff).
Anche con lo stesso schema di bit, tipi diversi possono avere valori diversi. ffffffff
come unsigned
ha il valore di 4294967295. Come int
, in base alla codifica dei numeri interi con segno, ha il valore di -1, -2147483647 o TBD. Come float
potrebbe essere un NAN.
cosa è la parola senza segno?
unsigned
memorizza un numero intero nell'intervallo [0 ... UINT_MAX]
. Non ha mai un valore negativo. Se il codice richiede un numero non negativo, utilizzare unsigned
. Se il codice richiede un numero di conteggio che può essere +, - o 0, utilizzare int
.
Update: per evitare un compilatore avvertimento circa l'assegnazione di un firmato int
a unsigned
, utilizzare il seguente. Questo è un unsigned
1u
negato - che è ben definito come sopra. L'effetto è lo stesso di -1
, ma trasmette le intenzioni dirette del compilatore.
unsigned int a = -1u;
See: [** complemento a due - Wikipedia, l'enciclopedia libera **] (https://en.wikipedia.org/wiki/Two%27s_complement) La risposta breve è "se il bit più significativo è '1', è interpretato come un ** negativo ** intero". –
http://www.cplusplus.com/forum/beginner/94567/ –
Sì, ma ciò è fatto dalla funzione 'printf', quindi, non riesco a capire quale ruolo interpreti la parola' unsigned'. Nel mio esempio, per entrambi i vars firmati e non firmati ho potuto vedere il suo valore come firmato o non firmato. Per chiarire, se posso vedere una varata firmata stampata come firmata o non firmata, a cosa serve la parola 'unsigned'? – rvillablanca