2010-09-04 16 views
27

Se ho un int e una variabile size_t, posso confrontarli piace:confrontando int con size_t

int i=1; 
size_t y=2; 
if(i==y) 
do something.. 

o devo tipo pressofuso uno di loro?

+2

Avete veramente bisogno di confrontare un 'int' ad un' size_t '? Generalmente non dovresti, e potresti erroneamente convertire un 'int' in' size_t' o viceversa da qualche parte. – GameZelda

+2

solo per motivi di conoscenza :) –

risposta

43

È sicuro se lo int è zero o positivo. Se è negativo, e size_t è uguale o superiore a int, allora lo int verrà convertito in size_t e quindi il suo valore negativo diventerà invece un valore positivo. Questo nuovo valore positivo viene quindi confrontato con il valore size_t, che può (in modo incredibilmente improbabile) fornire un falso positivo. Per essere veramente al sicuro (e forse eccessivamente cauto) Verificare che il int è non negativo prima:

/* given int i; size_t s; */ 
if (i>=0 && i == s) 

e per sopprimere avvisi del compilatore:

if (i>=0 && (size_t)i == s) 
0

size_t sarà una sorta di tipo integer (sebbene possibilmente non firmato, quindi potrebbe generare un avviso) quindi il cast appropriato dovrebbe essere fatto automaticamente.

Come altri hanno già detto, è possibile rivisitare qualsiasi calcolo stia producendo il int e vedere se è possibile farlo in size_t in primo luogo se si sta calcolando una dimensione richiesta per qualcosa.

+13

'size_t' * deve * essere senza segno. –

+0

I tipi effettivamente non firmati creano più problemi di quanti ne risolvano (se usati per le dimensioni). Un consiglio migliore sarebbe quello di scappare da unsigned come una quantità il prima possibile (lanciare in 'int'). Puoi avere problemi con i valori di 'INT_MAX', ma con unsigned puoi avere problemi intorno allo zero e questo è molto più comune nella programmazione. – 6502

0

E 'bene a confrontare un valore size_t con un valore int, il valore int verrà convertito in modo implicito unsigned tipo.

Alcuni compilatori emetteranno un avviso quando si mischiano i tipi signed e unsigned nei confronti. In tal caso, è possibile convertire esplicitamente il valore signed in un tipo appropriato unsigned per sopprimere l'avviso.

+3

Generalmente non è una buona idea coprire solo gli avvisi del compilatore come questo, IMO. Ci sono alternative migliori (ad esempio usando uno di 'size_t' o 'int' invece di entrambi in primo luogo). – strager