Realmente no puedo encontrar una fuente "autorizada" sobre este asunto, principalmente porque esto es probablemente una cuestión de convención, y la terminología es a menudo muy inconsistente. Pero, el siguiente extracto de " Codificación segura en C y C ++ " de Robert Seacord resume mi comprensión de la situación:
Un desbordamiento de entero ocurre cuando un entero se incrementa más allá de su valor máximo o disminuye más allá de su valor mínimo 3 . Los desbordamientos de enteros están estrechamente relacionados con la representación subyacente.
La nota al pie dice:
[3] La disminución de un número entero más allá de su valor mínimo a menudo se conoce como un flujo inferior entero , aunque técnicamente este término se refiere a una condición de coma flotante.
La razón por la que lo llamamos un desbordamiento de enteros es porque simplemente no hay suficiente espacio disponible en el tipo para representar el valor. En ese sentido, es similar a un desbordamiento del búfer (excepto que en lugar de cruzar realmente el límite del búfer, generalmente exhibe un comportamiento envolvente. *) Desde esta perspectiva, no hay diferencia conceptual entre INT_MIN - 1y INT_MAX + 1. En ambos casos, simplemente no hay suficiente espacio en el inttipo de datos para representar cualquiera de los valores, por lo que lo que tenemos es un desbordamiento .
También podría ser útil observar que en las arquitecturas de procesador x86 y x86_64, el registro de banderas incluye un bit de desbordamiento . El bit de desbordamiento se establece cuando se desborda una operación aritmética de enteros con signo. La expresión INT_MIN - 1establecerá el bit de desbordamiento. (No hay bit de "subdesbordamiento"). Así que claramente, los ingenieros de AMD e Intel usan el término "desbordamiento" para describir el resultado de una operación aritmética de enteros que tiene demasiados bits para caber en el tipo de datos, independientemente de si el valor es numéricamente demasiado grande o demasiado pequeño.
* De hecho, en C, el desbordamiento de entero con signo es en realidad un comportamiento indefinido, pero en otros lenguajes como Java, la aritmética del complemento a los dos se ajustará.
INT_MIN - 1oINT_MAX + 1