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?
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?
È 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)
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.
'size_t' * deve * essere senza segno. –
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
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.
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
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
solo per motivi di conoscenza :) –