Pregunta

¿Cuándo es apropiado utilizar una variable sin signo en lugar de una con signo?¿Qué tal en un for ¿bucle?

Escucho muchas opiniones sobre esto y quería ver si había algo parecido a un consenso.

for (unsigned int i = 0; i < someThing.length(); i++) {  
    SomeThing var = someThing.at(i);  
    // You get the idea.  
}

Sé que Java no tiene valores sin firmar, y esa debe haber sido una decisión consciente Microsistemas solares' parte.

¿Fue útil?

Solución

Me alegré de encontrar una buena conversación sobre este tema, ya que realmente no había pensado mucho en ello antes.

En resumen, firmado es una buena opción general, incluso cuando esté completamente seguro de que todos los números son positivos, si va a hacer aritmética con la variable (como en un caso típico de bucle for).

Si vas a hacer cosas bit a bit como máscaras, sin firmar comienza a tener más sentido.O, si está desesperado por obtener ese rango positivo extra aprovechando el bit de signo.

Personalmente, me gustan los firmados porque no confío en ser consistente y evitar mezclar los dos tipos (como advierte el artículo).

Otros consejos

En el ejemplo anterior, cuando 'i' siempre será positiva y un rango más alto sería beneficioso, sería útil unsigned.Como si estuvieras usando declaraciones de 'declaración', como:

#declare BIT1 (unsigned int 1)
#declare BIT32 (unsigned int reallybignumber)

Especialmente cuando estos valores nunca cambiarán.

Sin embargo, si está utilizando un programa de contabilidad en el que las personas son irresponsables con su dinero y están constantemente en números rojos, definitivamente querrá utilizar "firmado".

Sin embargo, estoy de acuerdo con Saint en que una buena regla general es usar firmado, que en realidad es el valor predeterminado de C, por lo que está cubierto.

Los compiladores de C y C++ generarán una advertencia cuando compare tipos firmados y sin firmar;en su código de ejemplo, no podía hacer que su variable de bucle no estuviera firmada y hacer que el compilador generara código sin advertencias (suponiendo que dichas advertencias estuvieran activadas).

Naturalmente, estás compilando con advertencias activadas al máximo, ¿verdad?

Y, ¿ha considerado compilar con "tratar las advertencias como errores" para ir un paso más allá?

La desventaja de usar números con signo es que existe la tentación de sobrecargarlos de modo que, por ejemplo, los valores 0->n sean la selección del menú y -1 significa que no hay nada seleccionado, en lugar de crear una clase que tenga dos variables, una para indicar si algo está seleccionado y otro para almacenar cuál es esa selección.Antes de que te des cuenta, estás probando uno negativo en todas partes y el compilador se queja de que quieres comparar la selección del menú con la cantidad de selecciones de menú que tienes, pero eso es peligroso porque son tipos diferentes. .Así que no hagas eso.

Yo pensaría que si su caso de negocio dicta que un número negativo no es válido, usted desear que se muestre o arroje un error.

Con eso en mente, recientemente descubrí los enteros sin signo mientras trabajaba en un proyecto que procesaba datos en un archivo binario y almacenaba los datos en una base de datos.Estaba "corrompiendo" deliberadamente los datos binarios y terminé obteniendo valores negativos en lugar del error esperado.Descubrí que aunque el valor se convirtió, el valor no era válido para mi caso de negocio.
Mi programa no falló y terminé ingresando datos incorrectos en la base de datos.Hubiera sido mejor si hubiera usado uint y el programa falló.

size_t suele ser una buena opción para esto, o size_type si estás usando una clase STL.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top