Беззнаковое целочисленное переполнение хорошо определено как стандартами C, так и С++. Например, C99 standard (§6.2.5/9
) указывает
Вычисление с использованием неподписанных операндов никогда не может превышать поток, потому что результат, который не может быть представлен результирующим целым типом без знака, равен уменьшено по модулю число, которое больше одного наибольшего значения, которое может быть представленный результирующим типом.
Однако, оба стандарта заявляют, что подписанное целочисленное переполнение - это поведение undefined. Опять же, из стандарта C99 (§3.4.3/1
)
Примером неустановленного поведения является поведение по целому числу по потоку
Есть ли историческая или (даже лучше!) техническая причина этого несоответствия?