Los enteros con signo en C representan números. Si a
y b
son variables de tipos enteros con signo, el estándar nunca requerirá que un compilador haga que la expresión se a+=b
almacene en a
otra cosa que no sea la suma aritmética de sus valores respectivos. Para estar seguros, si la suma aritmética no encaja a
, el procesador podría no ser capaz de colocarla allí, pero el estándar no requeriría que el compilador truncara o ajustara el valor, o hiciera cualquier otra cosa si los valores exceden Los límites para sus tipos. Tenga en cuenta que si bien el estándar no lo requiere, las implementaciones de C pueden atrapar desbordamientos aritméticos con valores firmados.
Los enteros sin signo en C se comportan como anillos algebraicos abstractos de enteros que son módulos congruentes con una potencia de dos, excepto en escenarios que involucran conversiones u operaciones con tipos más grandes. La conversión de un número entero de cualquier tamaño a un tipo sin signo de 32 bits producirá el miembro correspondiente a cosas que son congruentes con ese número entero mod 4.294.967.296. La razón por la que restar 3 de 2 produce 4,294,967,295 es que agregar algo congruente a 3 a algo congruente a 4,294,967,295 producirá algo congruente a 2.
Los tipos abstractos de anillos algebraicos son a menudo cosas útiles para tener; desafortunadamente, C usa la firma como factor decisivo para determinar si un tipo debe comportarse como un anillo. Peor aún, los valores sin signo se tratan como números en lugar de miembros del anillo cuando se convierten a tipos más grandes, y los valores sin signo más pequeños que int
se convierten a números cuando se realiza una aritmética sobre ellos. Si v
es un uint32_t
igual 4,294,967,294
, entonces v*=v;
debería hacer v=4
. Desafortunadamente, si int
son 64 bits, entonces no se sabe qué v*=v;
podría hacer.
Dado el estándar tal como es, sugeriría usar tipos sin signo en situaciones en las que uno quiera el comportamiento asociado con los anillos algebraicos, y los tipos con signo cuando quiera representar números. Es lamentable que C hiciera las distinciones de la manera en que lo hizo, pero son lo que son.