¿Puedo comparar int con size_t directamente en C?

3 minutos de lectura

¿Puedo comparar un int y un size_t variables como esta:

int i = 1;
size_t y = 2;
if (i == y) {
    // Do something
}

¿O tengo que escribir uno de ellos?

  • ¿Realmente necesitas comparar un int a un size_t? Por lo general, no debería hacerlo y es posible que esté convirtiendo incorrectamente un int a size_t o viceversa en algún lugar.

    – GameZelda

    4 de septiembre de 2010 a las 11:19


  • solo por el bien del conocimiento 🙂

    usuario379888

    4 de septiembre de 2010 a las 13:25

  • El caso “obvio” para comparar un int y un size_t es snprintf().

    – John Hascall

    6 de julio de 2018 a las 13:52

  • Es posible que desee verificar los límites de un índice vectorial int, o int sin signo.

    – Quentin Reino Unido

    28 de septiembre de 2019 a las 11:10


Es seguro siempre que el int es cero o positivo. Si es negativo y size_t es de igual o mayor rango que intentonces el int se convertirá en size_t y así su valor negativo se convertirá en cambio en un valor positivo. Este nuevo valor positivo se compara luego con el size_t valor, que puede (en una coincidencia asombrosamente improbable) dar un falso positivo. Para estar realmente seguro (y tal vez demasiado cauteloso), verifique que el int es no negativo primero:

/* 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)

Avatar de usuario de Helliarc
heliarc

Si va a comparar un tipo int con size_t (o cualquier otro tipo de biblioteca), está haciendo una comparación arriesgada porque int está firmado y size_t no está firmado, por lo que uno de ellos se convertirá implícitamente según su compilador/plataforma. Lo mejor que puedes hacer es reescribir tu int i como:

decltype(y.size()) i = 1;

Esto asigna su i como el tipo seguro que está tratando de comparar, y creo que es una buena práctica. Esta solución también es útil en todo tipo de iteradores. Por lo general, no desea confiar en el compilador para que emita por usted, puede hacerlo, pero es arriesgado e innecesario.

Avatar de usuario de Paul Tomblin
pablo tomblin

size_t será una especie de tipo entero (aunque posiblemente sin firmar, por lo que podría generar una advertencia), por lo que la conversión adecuada se debe realizar automáticamente.

Como ya han dicho otros, es posible que desee revisar cualquier cálculo que esté produciendo el int y mira si puedes hacerlo en size_t en primer lugar, si está calculando un tamaño requerido para algo.

  • size_t debe estar sin firmar.

    – Felipe Potter

    4 de septiembre de 2010 a las 11:32

  • En realidad, los tipos sin firmar crean más problemas de los que resuelven (cuando se usan para tamaños). Un mejor consejo sería huir de unsigned como cantidad tan pronto como sea posible (casting to int). Puedes tener problemas alrededor INT_MAX valores, pero con unsigned puede tener problemas alrededor de cero y eso es mucho más común en la programación.

    – 6502

    29 de agosto de 2017 a las 6:34

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

Algunos compiladores emitirán una advertencia cuando mezcle signed y unsigned tipos en las comparaciones. En ese caso, puede convertir explícitamente el signed valor a un valor apropiado unsigned escriba para suprimir la advertencia.

¿Ha sido útil esta solución?