Naprawdę nie mogę znaleźć „autorytatywnego” źródła w tej sprawie, głównie dlatego, że jest to prawdopodobnie kwestia konwencji, a terminologia jest często bardzo niespójna. Ale poniższy fragment „ Bezpiecznego kodowania w C i C ++ ” Roberta Seacorda podsumowuje moje rozumienie sytuacji:
Przepełnienie liczb całkowitych występuje, gdy liczba całkowita zostanie zwiększona powyżej wartości maksymalnej lub zmniejszona powyżej wartości minimalnej 3 . Przepełnienia liczb całkowitych są ściśle powiązane z podstawową reprezentacją.
Przypis mówi dalej:
[3] Zmniejszenie liczby całkowitej powyżej jej minimalnej wartości jest często określane jako niedomiar liczby całkowitej , chociaż technicznie termin ten odnosi się do warunku zmiennoprzecinkowego.
Powodem, dla którego nazywamy to przepełnieniem liczb całkowitych, jest to, że po prostu nie ma wystarczającej ilości miejsca w typie do przedstawienia wartości. W tym sensie jest podobny do przepełnienia bufora (z wyjątkiem faktycznego przekroczenia granicy bufora, zwykle wykazuje zachowanie zawijania. *) Z tej perspektywy nie ma różnicy koncepcyjnej między INT_MIN - 1
a INT_MAX + 1
. W obu przypadkach po prostu nie ma wystarczającej ilości miejsca w int
typie danych, aby reprezentować którąkolwiek wartość - więc mamy przepełnienie .
Warto również zauważyć, że w architekturach procesorów x86 i x86_64 rejestr flag zawiera bit przepełnienia . Bit przepełnienia jest ustawiany, gdy przepełniona zostanie arytmetyczna operacja ze znakiem całkowitym. Wyrażenie INT_MIN - 1
ustawi bit przepełnienia. (Nie ma bitu „niedopełnienia”.) Tak więc wyraźnie inżynierowie AMD i Intela używają terminu „przepełnienie” do opisania wyniku operacji arytmetycznej na liczbach całkowitych, która ma zbyt wiele bitów, aby zmieścić się w typie danych, niezależnie od tego, czy wartość jest liczbowo za duża lub za mała.
* W rzeczywistości w C podpisane przepełnienie liczb całkowitych jest w rzeczywistości nieokreślonym zachowaniem, ale w innych językach, takich jak Java, arytmetyka dopełniania tych dwóch elementów zostanie zawinięta.
INT_MIN - 1
alboINT_MAX + 1