Dlaczego zachowuje się zdefiniowane przekroczenie liczby całkowitej bez znaku, ale przepełnienie całkowitoliczbowe nie jest?
Przepełnienie liczby całkowitej bez podpisu jest dobrze zdefiniowane zarówno przez standardy C, jak i C ++. Na przykładStandard C99 (§6.2.5/9
) stany
Obliczenia obejmujące niepodpisane operandy nigdy nie mogą przepłynąć, ponieważ wynik, który nie może być reprezentowany przez wynikowy typ liczby całkowitej bez znaku, jest zmniejszany o liczbę, która jest o jeden większa niż największa wartość, która może być reprezentowana przez wynikowy typ.
Oba standardy stwierdzają jednak, że przekroczenie liczby podpisanej liczby całkowitej jest zachowaniem niezdefiniowanym. Ponownie od standardu C99 (§3.4.3/1
)
Przykładem niezdefiniowanego zachowania jest zachowanie nad przepływem całkowitym
Czy istnieje jakaś historyczna lub (jeszcze lepsza!) Techniczna przyczyna tej rozbieżności?