example ejemplos c++ c types int unsigned

ejemplos - Uso de C/C++ de int o unsigned int



awk file example (7)

Creo que la razón más importante es que si elige unsigned int , puede obtener algunos errores lógicos. De hecho, a menudo no necesita el rango de unsigned int , usar int es más seguro.

En muchos ejemplos de código, código fuente, bibliotecas, etc., veo el uso de int cuando, por lo que puedo ver, un unsigned int tendría mucho más sentido.

Un lugar que veo mucho es en bucles. Vea el siguiente ejemplo:

for(int i = 0; i < length; i++) { // Do Stuff }

¿Por qué demonios int un int lugar de un unsigned int ? ¿Es solo la pereza, a la gente no se le puede molestar escribir unsigned ?


El uso de unsigned puede introducir errores de programación que son difíciles de detectar y, por lo general, es mejor usar int firmado para evitarlos. Un ejemplo sería cuando decides iterar hacia atrás en lugar de reenviar y escribir esto:

for (unsigned i = 5; i >= 0; i--) { printf("%d/n", i); }

Otra sería si haces algunas matemáticas dentro del bucle:

for (unsigned i = 0; i < 10; i++) { for (unsigned j = 0; j < 10; j++) { if (i - j >= 4) printf("%d %d/n", i, j); } }

El uso de unsigned introduce el potencial para este tipo de errores, y realmente no hay ninguna ventaja.


Elegí ser lo más explícito posible durante la programación. Es decir, si tengo la intención de usar una variable cuyo valor sea siempre positivo, se usa unsigned . Muchos aquí mencionan "errores difíciles de detectar", pero pocos dan ejemplos. Considera el siguiente ejemplo de defensor para usar unsigned , a diferencia de la mayoría de las publicaciones aquí:

enum num_things { THINGA = 0, THINGB, THINGC, NUM_THINGS }; int unsafe_function(int thing_ID){ if(thing_ID >= NUM_THINGS) return -1; ... } int safe_function(unsigned int thing_ID){ if(thing_ID >= NUM_THINGS) return -1; ... } int other_safe_function(int thing_ID){ if((thing_ID >=0 ) && (thing_ID >= NUM_THINGS)) return -1; ... } /* Error not caught */ unsafe_function(-1); /* Error is caught */ safe_function((unsigned int)-1);

En el ejemplo anterior, ¿qué sucede si se pasa un valor negativo como thing_ID ? En el primer caso, encontrará que el valor negativo no es mayor o igual a NUM_THINGS , por lo que la función continuará ejecutándose.

En el segundo caso, en realidad lo detectará en tiempo de ejecución porque la firmeza de thing_ID obliga al condicional a ejecutar una comparación sin firmar .

Por supuesto, podrías hacer algo como other_safe_function , pero esto parece más bien un kludge para usar enteros con signo en lugar de ser más explícitos y usar unsigned para empezar.


En general, es la pereza o la falta de comprensión.

Siempre uso un unsigned int cuando el valor no debe ser negativo. Eso también sirve para el propósito de la documentación de especificar cuáles deberían ser los valores correctos.

En mi humilde opinión, la afirmación de que es más seguro usar "int" que "unsigned int" es simplemente errónea y una mala práctica de programación.

Si ha usado Ada o Pascal, estaría acostumbrado a usar la práctica aún más segura de especificar rangos específicos para valores (por ejemplo, un entero que solo puede ser 1, 2, 3, 4, 5).


Este pequeño código está relacionado con el uso de mayúsculas, si llama a algún elemento vectorial, entonces el prototipo es int, pero hay muchas formas modernas de hacerlo en c ++, por ejemplo. para (const auto & v: vec) {} o iteradores, en algunos cálculos, si no puede restar / alcanzar un número negativo, puede y debe usar unsigned (explica mejor el rango de valores esperado), a veces como muchos ejemplos publicados aquí muestran que realmente Necesito int, pero la verdad es que todo se trata del uso y la situación, no hay una regla estricta que se aplique a todos los casos y sería un poco tonto forzar a uno sobre ...


Si length también es int , entonces deberías usar el mismo tipo de entero, de lo contrario sucederán cosas extrañas cuando mezclas los tipos con signo y sin signo en una declaración de comparación. La mayoría de los compiladores te darán una advertencia.

Podría continuar preguntando, ¿por qué debería firmarse la length ? Bueno, eso es probablemente histórico.

Además, si decides invertir el bucle, es decir

for(int i=length-1;i>=0 ;i--) { // do stuff }

la lógica se rompe si usas ints sin firmar.


Utilizo int sin signo solo cuando la longitud es mayor que el valor int máximo. El uso de int sin signo puede introducir errores difíciles de detectar, especialmente si la longitud es variable.