¿Cuándo usar valores sin signo sobre los firmados?

votos
66

¿Cuándo es apropiado usar una variable sin signo sobre una firmada? ¿Qué tal en un forbucle?

Escuché 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 signo, y esa debe haber sido una decisión consciente por parte de Sun Microsystems .

Publicado el 02/08/2008 a las 04:34
fuente por usuario
En otros idiomas...                            


5 respuestas

votos
61

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

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

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

Personalmente, me gusta firmar porque no confío en mí mismo para mantenerme constante y evitar mezclar los dos tipos (como el artículo advierte en contra).

Respondida el 02/08/2008 a las 04:49
fuente por usuario

votos
8

En su ejemplo anterior, cuando 'i' siempre será positivo y un rango superior sería beneficioso, sin firmar sería útil. Al igual que si está utilizando declaraciones 'declarar', como:

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

Especialmente cuando estos valores nunca cambian.

Sin embargo, si está haciendo un programa de contabilidad donde las personas son irresponsables con su dinero y están constantemente en números rojos, definitivamente querrá usar 'firmado'.

Sin embargo, estoy de acuerdo con Saint que una buena regla general es usar firmado, que C de manera predeterminada establece, para que estés cubierto.

Respondida el 02/08/2008 a las 05:31
fuente por usuario

votos
7

Pensaría que si su caso comercial dictamina que un número negativo no es válido, le gustaría que se muestre o arroje un error.

Con esto en mente, recién hace poco descubrí números enteros sin signo mientras trabajaba en un proyecto procesando datos en un archivo binario y almacenando los datos en una base de datos. Estaba "corrompiendo" intencionalmente los datos binarios, y terminé obteniendo valores negativos en lugar de un error esperado. Descubrí que, a pesar de que el valor se convirtió, el valor no era válido para mi caso comercial.
Mi programa no cometió un error y terminé obteniendo datos incorrectos en la base de datos. Hubiera sido mejor si hubiera usado uinty hubiera fallado el programa.

Respondida el 10/11/2008 a las 20:04
fuente por usuario

votos
7

Los compiladores C y C ++ generarán una advertencia al comparar tipos firmados y sin firmar; en su código de ejemplo, no podría hacer que su variable de bucle sea sin signo y hacer que el compilador genere código sin advertencias (suponiendo que dichas advertencias estuvieran activadas).

Naturalmente, estás compilando con advertencias en todo el camino, ¿verdad?

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

La desventaja de utilizar 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 indica si se selecciona algo y otro para almacenar lo que es esa selección. Antes de que te des cuenta, estás probando uno negativo en todas partes y el compilador se queja de cómo deseas comparar la selección de menú con el número de selecciones de menú que tienes, pero eso es peligroso porque son tipos diferentes. . Entonces no hagas eso.

Respondida el 04/08/2008 a las 14:35
fuente por usuario

votos
6

size_ta menudo es una buena opción para esto, o size_typesi está usando una clase STL.

Respondida el 02/08/2008 a las 06:51
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more