Al programar 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:Tipo int predeterminado: ¿Firmado o sin firmar?
signed: Mejor comportamiento matemático, menos posibilidad de comportamiento extraño si intentas ir por debajo de cero en algún caso límite en el que no hayas 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 debe nunca ser negativo.
En realidad, creo que el esquema de promoción de tipos de C causa que * signed * ints se comporte de forma diferente a lo que cabría esperar. Las notas sin firmar se comportan bien, si conoces la aritmética del módulo, mientras que las notas firmadas tienen un comportamiento dependiente de la implementación y conversiones graciosas por todos lados. Pero si solo va a usar uno, para evitar mezclarlos, tendrá que firmarse. Así que estoy de acuerdo con la conclusión de que unsigned int no debe usarse de todos modos, pero en realidad creo que los bucles descendentes no deben usarse de todos modos ... –
Ha pasado mucho tiempo desde que GCC no pudo advertir que 'unsigned> = 0' como siempre verdadero. La guía de Google es engañosa en el mejor de los casos, peligrosa en el peor, ya que un tipo muy común y muy correcto para un iterador de bucle será el tipo sin signo 'size_t'. La prueba correcta para underflow sin signo cuando se cuenta hacia atrás usando un contador de origen cero es 'i! = ~ 0U'. –