Agregar dos enteros de 32 bits puede resultar en un desbordamiento de enteros:
uint64_t u64_z = u32_x + u32_y;
Este desbordamiento se puede evitar si uno de los enteros de 32 bits se convierte primero o se agrega a un entero de 64 bits.
uint64_t u64_z = u32_x + u64_a + u32_y;
Sin embargo, si el compilador decide reordenar la adición:
uint64_t u64_z = u32_x + u32_y + u64_a;
el desbordamiento de enteros aún podría ocurrir.
¿Se permite a los compiladores hacer tal reordenación o podemos confiar en que noten la inconsistencia del resultado y mantengan el orden de las expresiones como está?
((uint32_t)-1 + (uint32_t)1) + (uint64_t)0
da como resultado 0
, mientras que (uint32_t)-1 + ((uint32_t)1 + (uint64_t)0)
da como resultado 0x100000000
, y estos dos valores no son iguales. Por tanto, es importante que el compilador pueda aplicar esa transformación o no. Pero sí, el estándar solo usa la palabra "desbordamiento" para enteros con signo, no sin signo.
uint32_t
valores, que no se desbordan, se ajustan. Estos no son comportamientos diferentes.