В надежде на создание канонического, вот некоторые нормативные спецификации (цитаты взяты из последнего черновика C ++):
- Целые числа без знака не переполняются: см. 6.7.1:
Беззнаковые целые должны подчиняться законам арифметики по модулю 2n, где n - количество битов в представлении значения этого конкретного размера целого числа.(44) Это подразумевает, что арифметика без знака не переполняется, потому что результат, который не может быть представлен результирующим целочисленным типом без знака, уменьшается по модулю на число, которое на единицу больше наибольшего значения, которое может быть представлено результирующим целочисленным типом без знака.
- Переполнение / недополнение со знаком целого не определено: см. 7.1.4:
Если во время вычисления выражения результат не определен математически илиза пределами представляемых значений для его типа поведение не определено.
Кстати, ни один из них не зависит от реализации, и компиляторы активно используют переполнения / недополнения для оптимизации.Например, как показано в следующем фрагменте:
void a();
void b();
void foo(int k) {
int z = k+1;
if (z < k) {
a();
} else {
b();
}
}
https://gcc.godbolt.org/z/0re-nM - ветвь исключается, даже если на реальной платформе из-за представления по модулю 2 z
может фактически стать меньше, чемk
.