Es solo un problema indirecto.
cosas malas pueden suceder si utiliza enteros con signo para operaciones bit a bit como &
, |
, <<
y >>
.
cosas malas pueden suceder completamente diferente si se utiliza enteros sin signo para la aritmética (flujo inferior, bucles infinitos al probar si un número es >= 0
etc.)
Debido a esto, algunos compiladores y herramientas de comprobación estática emitirán advertencias cuando se mezclan enteros con signo y sin signo en cualquier tipo de operación (aritmética o manipulación de bits)
Aunque puede ser seguro mezclarlos en casos simples como en el ejemplo, si lo hace significa que no puede usar esas herramientas de comprobación estáticas (o debe desactivar esas advertencias) lo que puede significar que otros errores no se detecten.
A veces no tiene otra opción, p. al hacer aritmética en valores de tipo size_t
en código de gestión de memoria.
En el ejemplo que se pegaba a int
, simplemente porque es más simple de tener un menor número de tipos y el int
va a ser allí de todos modos ya que es el tipo del primer argumento para main()
.
No es un engaño, pero vale la pena leerlo de todos modos: http://stackoverflow.com/questions/859943/c-how-can-fix-warnings-like-comparison-between-signed-and-unsigned – finnw