View Full Version : [C] perché questo warning?
Garet Jax
26-07-2007, 18:40
Ciao a tutti,
devo scrivere un programma che tratta i singoli bit di un intero.
Giusto per fare una prova ho scritto un programma che dichiara un intero unsigned a cui poi viene assegnato il valore (2^32) - 1 = 4294967295.
Compilando mi viene segnalato il seguente warning:
"warning: this decimal constant is unsigned only in ISO C90"
Non mi crea particolari problemi, ma mi chiedo come mai mi venga segnalato.
Se dichiaro una variabile unsigned, non dovrei avere disponibili i valori da 0 a (2^32) -1?
Jax
stdecden
26-07-2007, 20:55
Non ne sono sicuro, ma potrebbe darsi che, dato che tu usi l'ultimo bit(quello piú sigificativo) in uno standard non ISO C90 viene interpretato come bit che determina se la variabile é positiva o negativa. Questo ti potrebbe dare problemi forse con un altro compilatore! Ripeto peró che é solo un ipotesi.
Garet Jax
27-07-2007, 12:18
Non ne sono sicuro, ma potrebbe darsi che, dato che tu usi l'ultimo bit(quello piú sigificativo) in uno standard non ISO C90 viene interpretato come bit che determina se la variabile é positiva o negativa. Questo ti potrebbe dare problemi forse con un altro compilatore! Ripeto peró che é solo un ipotesi.
anch'io la penso così.
Però non capisco a che serve allora dichiarare la variabile unsigned.
:confused:
stdecden
27-07-2007, 12:37
prova a mettere il suffisso UL(unsigned long)
sottovento
27-07-2007, 12:46
Ciao a tutti,
devo scrivere un programma che tratta i singoli bit di un intero.
Giusto per fare una prova ho scritto un programma che dichiara un intero unsigned a cui poi viene assegnato il valore (2^32) - 1 = 4294967295.
Compilando mi viene segnalato il seguente warning:
"warning: this decimal constant is unsigned only in ISO C90"
Non mi crea particolari problemi, ma mi chiedo come mai mi venga segnalato.
Se dichiaro una variabile unsigned, non dovrei avere disponibili i valori da 0 a (2^32) -1?
Jax
Veramente 4294967295 e' uguale a 0xFFFFFFFF, che equivale a dire, su un intero a 32 bit, che e' -1.
Per questo motivo ti segnala il warning.
Come hai effettuato l'assegnazione? Se per esempio hai scritto
unsigned int a = 4294967295;
otterrai il warning poiche' la variabile a e' unsigned, ma il numero senza alcuna specifica ulteriore viene considerato con il relativo segno.
Prova a scrivere
unsigned int a = (unsigned int)0xFFFFFFFF;
(uso l'esadecimale perche' mi sembra piu' comprensibile, soprattutto per il fatto che si voglia andare a lavorare sui bit).
Garet Jax
30-07-2007, 16:45
Per questo motivo ti segnala il warning.
Come hai effettuato l'assegnazione? Se per esempio hai scritto
unsigned int a = 4294967295;
esatto, proprio così.
otterrai il warning poiche' la variabile a e' unsigned, ma il numero senza alcuna specifica ulteriore viene considerato con il relativo segno.
Capito.
Ho fatto delle prove ed è salato fuori che non digerisce la forma decimale; infatti anche con unsigned int numero = (unsigned int) 4294967295; salta fuori il warning, mentre co la rappresentazione esdecimale va tutto liscio.
Grazie per la delucidazione.
Jax
Garet Jax
02-08-2007, 16:27
giusto per completare il concetto (magari a qualcuno interessa, se è curioso come me ;) ), ho scoperto che si possono utilizzare anche i decimali per l'assegnamento ad un unsigned int, ma bisogna specificare che è senza segno con la classica specifica di conversione (in questo caso u).
Quindi:
unsigned int numero = 4294967295;
diventa
unsigned int numero = 4294967295u;
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.