L'ajout de deux entiers 32 bits peut entraîner un débordement d'entier:
uint64_t u64_z = u32_x + u32_y;
Ce débordement peut être évité si l'un des entiers 32 bits est d'abord converti ou ajouté à un entier 64 bits.
uint64_t u64_z = u32_x + u64_a + u32_y;
Cependant, si le compilateur décide de réorganiser l'ajout:
uint64_t u64_z = u32_x + u32_y + u64_a;
le dépassement d'entier peut encore se produire.
Les compilateurs sont-ils autorisés à effectuer une telle réorganisation ou pouvons-nous leur faire confiance pour remarquer l'incohérence du résultat et conserver l'ordre des expressions tel quel?
((uint32_t)-1 + (uint32_t)1) + (uint64_t)0
résultats dans 0
, alors que les (uint32_t)-1 + ((uint32_t)1 + (uint64_t)0)
résultats dans 0x100000000
, et ces deux valeurs ne sont pas égales. Il est donc important que le compilateur puisse ou non appliquer cette transformation. Mais oui, la norme n'utilise que le mot «débordement» pour les entiers signés, pas non signés.
uint32_t
valeurs ajoutées - qui ne débordent pas, elles s'enroulent. Ce ne sont pas des comportements différents.