Додавання двох 32-бітних цілих чисел може призвести до переповнення цілого числа:
uint64_t u64_z = u32_x + u32_y;
Цього переповнення можна уникнути, якщо одне із 32-розрядних цілих чисел спочатку переведено на кастинг або додане до 64-бітного цілого числа.
uint64_t u64_z = u32_x + u64_a + u32_y;
Однак якщо компілятор вирішить змінити порядок додавання:
uint64_t u64_z = u32_x + u32_y + u64_a;
переповнення цілого числа все-таки може відбутися.
Чи дозволяється компіляторам проводити таке переупорядкування чи ми можемо їм довіряти помічати результат невідповідності та зберігати порядок виразів таким, яким є?
((uint32_t)-1 + (uint32_t)1) + (uint64_t)0
призводить 0
, в той час як (uint32_t)-1 + ((uint32_t)1 + (uint64_t)0)
результати в 0x100000000
, і ці два значення не рівні. Тому важливо, чи може компілятор застосувати це перетворення чи ні. Але так, стандарт використовує лише слово "overflow" для підписаних цілих чисел, а не без підпису.
uint32_t
значення - які не переповнюються, вони завершуються. Це не різні форми поведінки.