Integer Überlauf das ist ein kanonisches Beispiel für "undefiniertes Verhalten" in C (wobei zu beachten ist, dass Operationen an Ganzzahlen ohne Vorzeichen niemals überlaufen, sie stattdessen als Wrap-Around definiert sind). Dies bedeutet, dass, sobald Sie x + y
ausgeführt haben, wenn es übergelaufen ist, Sie bereits abgespritzt sind. Für eine Überprüfung ist es zu spät - Ihr Programm könnte bereits abgestürzt sein. Stellen Sie es sich vor, als ob Sie nach Division durch Null suchen würden - wenn Sie warten, bis die Division ausgeführt wurde, um zu überprüfen, ist es schon zu spät.
Das bedeutet also, dass Methode (1) der einzig richtige Weg ist. Für max
können Sie INT_MAX
von <limits.h>
verwenden.
Wenn x
und/oder y
negativ sein können, dann sind die Dinge schwieriger - Sie müssen den Test so durchführen, dass der Test selbst keinen Überlauf verursachen kann.
if ((y > 0 && x > INT_MAX - y) ||
(y < 0 && x < INT_MIN - y))
{
/* Oh no, overflow */
}
else
{
sum = x + y;
}
Eigentlich ist das Duplikat überhaupt kein Duplikat, es geht um 'unsigned' spricht die Wraparound Semantik gut definiert hat, während eine ganze Zahl mit Vorzeichen überquell in C. undefiniertes Verhalten ist –
Es gibt keine Notwendigkeit, beide zu überprüfen ist, 'sum