programming languages examples language-agnostic coding-style

language-agnostic - examples - programming languages 2018



Tipo int predeterminado: ¿Firmado o sin firmar? (7)

Asignar una asignación de tipo más específica (como unsigned int) transmite más información sobre el uso de la variable y puede ayudar al compilador a realizar un seguimiento de las ocasiones en las que se asigna un valor "incorrecto". Por ejemplo, si usa una variable para rastrear la ID de la base de datos de un objeto / elemento, es probable que nunca haya un momento en que la ID sea menor que cero (o uno); en este tipo de caso, en lugar de afirmar ese estado, usar un valor entero sin signo transmite esa declaración a otros desarrolladores, así como al compilador.

Cuando se programa en un lenguaje tipo C, ¿el tipo entero "predeterminado" debe ser int o uint / unsigned int? De manera predeterminada, me refiero a cuando no necesitas números negativos, pero cualquiera de ellos debe ser lo suficientemente grande para los datos que tienes. Puedo pensar en buenos argumentos para ambos:

firmado: mejor comportamiento matemático, menos posibilidad de comportamiento extraño si intenta ir por debajo de cero en algún caso límite en el que no haya pensado, generalmente evita mejor los casos de esquineras.

unsigned: Proporciona un poco más de seguridad contra el desbordamiento, en caso de que sus suposiciones sobre los valores sean incorrectas. Sirve como documentación de que el valor representado por la variable nunca debe ser negativo.


Ciertamente firmado. Si el desbordamiento te preocupa, el subdesbordamiento debería preocuparte más, porque ir "por debajo de cero" por accidente es más fácil que por int-max.

"Sin firmar" debe ser una opción consciente que haga que el desarrollador piense en los riesgos potenciales, solo cuando esté absolutamente seguro de que nunca puede pasar a negativo (ni siquiera accidentalmente) y que necesita el espacio de valor adicional.


Como regla general, utilicé ints sin firmar para contar cosas y firmé ints para medir cosas.

Si se encuentra disminuyendo o restando de un int sin firmar, entonces debe estar en un contexto en el que ya espera tener cuidado de no infrautilizar (por ejemplo, porque está en algún código de bajo nivel que se aleja del final). de una cuerda, así que, por supuesto, primero se ha asegurado de que la cuerda sea lo suficientemente larga como para soportar esto). Si no se encuentra en un contexto como ese, donde es absolutamente crítico que no baje a cero, entonces debería haber usado un valor firmado.

En mi uso, las notas sin signo son para valores que no pueden ser negativos (o para una en un millón de situaciones en las que realmente se desea modulo 2 ^ N aritmética), no para valores que simplemente no son negativos, en la implementación actual , probablemente.


Dudo que haya una respuesta lingüística realmente buena para esto. Existen suficientes diferencias entre los idiomas y la forma en que manejan los tipos mixtos que ninguna respuesta va a tener sentido para todos (o incluso para la mayoría).

En los idiomas que uso con más frecuencia, uso firmado a menos que tenga una razón específica para hacer lo contrario. Eso es principalmente C y C ++ sin embargo. En otro idioma, bien podría dar una respuesta diferente.


La Guía de estilo de Google C ++ tiene una opinión interesante sobre los enteros sin signo:

(la cita sigue :)

En enteros sin signo

Algunas personas, incluidos algunos autores de libros de texto, recomiendan utilizar tipos sin firmar para representar números que nunca son negativos. Esto está pensado como una forma de auto-documentación. Sin embargo, en C, las ventajas de dicha documentación son superadas por los errores reales que puede introducir. Considerar:

for (unsigned int i = foo.Length()-1; i >= 0; --i) ...

¡Este código nunca terminará! Algunas veces, gcc notará este error y le advertirá, pero a menudo no lo hará. Igualmente pueden ocurrir errores graves al comparar las variables firmadas y no firmadas. Básicamente, el esquema de promoción de tipos de C hace que los tipos sin firmar se comporten de forma diferente a lo que cabría esperar.

Entonces, documente que una variable no es negativa usando aserciones. No use un tipo sin firmar.

(fin de cita)


No obtiene mucha ''seguridad contra desbordamiento'' con unsigned. Es probable que obtengas un comportamiento diferente pero extraño que con la firma, pero un poco más tarde ... ¿Es mejor tener esas suposiciones justo antes de la mano, tal vez?


Tiendo a firmar, a menos que sepa que necesito unsigned, ya que int se firma normalmente, y requiere más esfuerzo escribir unsigned int , y uint puede causarle a otro programador una ligera pausa para pensar cuáles pueden ser los valores.

Por lo tanto, no veo ningún beneficio solo por el incumplimiento de un unsigned, ya que la int normal está firmada.