Adicionar dois inteiros de 32 bits pode resultar em um estouro de inteiros:
uint64_t u64_z = u32_x + u32_y;
Esse estouro pode ser evitado se um dos inteiros de 32 bits for convertido primeiro ou adicionado a um inteiro de 64 bits.
uint64_t u64_z = u32_x + u64_a + u32_y;
No entanto, se o compilador decidir reordenar a adição:
uint64_t u64_z = u32_x + u32_y + u64_a;
o estouro de inteiro ainda pode acontecer.
Os compiladores podem fazer esse reordenamento ou podemos confiar que eles notarão a inconsistência do resultado e manterão a ordem das expressões como está?
((uint32_t)-1 + (uint32_t)1) + (uint64_t)0
resulta em permanece 0
, enquanto (uint32_t)-1 + ((uint32_t)1 + (uint64_t)0)
resulta em 0x100000000
, e esses dois valores não são iguais. Portanto, é significativo se o compilador pode ou não aplicar essa transformação. Mas sim, o padrão só usa a palavra "estouro" para inteiros com sinal, não sem sinal.
uint32_t
valores adicionados - que não estouram, eles quebram. Esses não são comportamentos diferentes.