Pregunta sobre el comportamiento de C para un flujo de flujo de entero sin signo
integer types (3)
He leído en muchos lugares que el desbordamiento de enteros está bien definido en C, a diferencia de la contraparte firmada.
¿El flujo es el mismo?
Por ejemplo:
unsigned int x = -1; // Does x == UINT_MAX?
Gracias.
No recuerdo dónde, pero leí en alguna parte que la aritmética en los tipos integrales sin signo es modular, por lo que si ese fuera el caso, entonces -1 == UINT_MAX mod (UINT_MAX + 1).
-1, cuando se expresa como un número de complemento de 2, equivale a 0xFF ... F para cuantos bits sea su número. En un espacio numérico sin signo, ese valor es el valor máximo posible (es decir, todos los bits están establecidos). Por lo tanto sí, x == UINT_MAX. El siguiente código emite "1" en un compilador estricto de C99:
#include <stdio.h>
#include <stdint.h>
#include <limits.h>
int main(int argc, char **argv){
uint32_t x = -1;
printf("%d", x == UINT_MAX ? 1 : 0);
return 0;
}
Estás mezclando números firmados y no firmados, lo cual es uncool.
unsigned int x = 0u - 1u; // is OK though
§6.2.5, párrafo 9:
Un cálculo que involucre operandos sin signo nunca puede desbordarse, porque un resultado que no puede ser representado por el tipo entero sin signo resultante se reduce en módulo, el número que es uno mayor que el valor más grande que puede ser representado por el tipo resultante.
Editar:
Disculpe, referencia incorrecta, pero el resultado todavía está marcado. La referencia correcta es §6.3.1.3 (conversión de entero con signo y sin signo):
si el nuevo tipo no está firmado, el valor se convierte al agregar o restar repetidamente uno más que el valor máximo que se puede representar en el nuevo tipo hasta que el valor esté en el rango del nuevo tipo.
Así que sí, x == UINT_MAX
.