Pregunta sobre el comportamiento de C para un subflujo de enteros sin signo

He leído en muchos lugares que el desbordamiento de enteros está bien definido en C a diferencia de la contraparte firmada.

¿El subdesbordamiento 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, así que si ese fuera el caso, entonces -1 == UINT_MAX mod (UINT_MAX + 1).

§6.2.5, párrafo 9:

Un cómputo que involucre operandos sin firmar nunca puede desbordarse, porque un resultado que no puede ser representado por el tipo de entero sin signo resultante se reduce en módulo al número que es uno mayor que el valor más grande que puede ser representado por el tipo resultante.

Editar:

Lo siento, referencia incorrecta, pero el resultado aún está anclado. 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.

Entonces sí, x == UINT_MAX .

-1, cuando se expresa como un número de complemento de 2, equivale a 0xFF … F por cuantos bits haya en su número. En un espacio de número sin signo, ese valor es el valor máximo posible (es decir, todos los bits están configurados). Por lo tanto, sí, x == UINT_MAX. El siguiente código emite “1” en un comstackdor estricto C99:

 #include  #include  #include  int main(int argc, char **argv){ uint32_t x = -1; printf("%d", x == UINT_MAX ? 1 : 0); return 0; } 

Está mezclando números con y sin firma, lo que no es bueno.

 unsigned int x = 0u - 1u; // is OK though