2010-09-04 19 views
27

Si tengo un int y una variable size_t, los puedo comparar cosas:comparación con int size_t

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

o tengo que encasillarse uno de ellos?

+2

¿Usted realmente necesita comparar un '' int' a un size_t ¿? Generalmente no deberías, y puedes estar equivocadamente convirtiendo un 'int' a' size_t' o viceversa en alguna parte. – GameZelda

+2

solo por el conocimiento :) –

Respuesta

43

Es seguro siempre que el int sea cero o positivo. Si es negativo, y size_t tiene un rango igual o superior a int, entonces el int se convertirá en size_t y, por lo tanto, su valor negativo se convertirá en un valor positivo. Este nuevo valor positivo se compara con el valor size_t, que puede (en una coincidencia asombrosamente improbable) dar un falso positivo. Para ser verdaderamente seguro (y quizás excesivamente precavido) Comprobar que la primera int es no negativo:

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

y para suprimir las advertencias del compilador:

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

size_t va a ser una especie de tipo entero (aunque posiblemente sin firmar, por lo que podría generar una advertencia) por lo que la fundición adecuada se debe hacer de forma automática.

Como ya han dicho otros, puede volver a visitar cualquier cálculo que esté produciendo el int y ver si puede hacerlo en size_t en primer lugar si está calculando un tamaño requerido para algo.

+13

'size_t' * debe * estar sin firmar. –

+0

Los tipos realmente sin firmar crean más problemas de los que resuelven (cuando se usan para tamaños). Un mejor consejo sería escaparse de unsigned como cantidad tan pronto como sea posible (lanzando a 'int'). Puede tener problemas con los valores 'INT_MAX', pero con unsigned puede tener problemas alrededor de cero y eso es mucho más común en la programación. – 6502

0

Está bien para comparar un valor con un valor size_tint, el valor int se convertirá implícitamente a unsigned tipo.

Algunos compiladores emitir una advertencia cuando se mezcla signed y unsigned tipos de comparaciones. En ese caso, puede convertir explícitamente el valor signed a un tipo apropiado unsigned para suprimir la advertencia.

+3

En general, no es una buena idea tapar las advertencias de compilación como esta, IMO. Hay mejores alternativas (por ejemplo, usar uno de 'size_t' o' int' en lugar de los dos en primer lugar). – strager