¿Es INT_MIN-1 un desbordamiento o desbordamiento?

10

Me parece recordar que estaba leyendo eso

  • underflowsignifica que tiene una magnitud demasiado pequeña que ya no se puede presentar en un tipo
  • overflowsignifica que tiene una magnitud demasiado grande que ya no se puede presentar en un tipo

Sin embargo, en la práctica percibo que los términos se usan de tal manera que

  • underflowsignifica que tiene un valor demasiado pequeño que ya no se puede presentar en un tipo
  • overflowsignifica que tiene un valor demasiado grande que ya no se puede presentar en un tipo

¿Cuál es el significado correcto para usar aquí? ¿Los términos se definen de manera diferente para los tipos de entero y coma flotante?

Johannes Schaub - litb
fuente
2
En general, el término "flujo inferior" parece estar reservado para la aritmética de coma flotante. Con números enteros, generalmente digo "desbordamiento", independientemente de si es INT_MIN - 1oINT_MAX + 1
Charles Salvia

Respuestas:

15

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á.

Charles Salvia
fuente
6

Es un desbordamiento. No se produce un flujo inferior para los valores enteros.

Un desbordamiento es cuando un valor es demasiado grande (demasiado lejos de cero) para ser representado por el tipo específico, y un subflujo es cuando es demasiado pequeño (demasiado cercano a cero).

Como los valores enteros más cercanos a cero (1 y -1) todavía pueden representarse con cualquier variable entera (suponiendo un entero con signo con más de un bit), no puede ocurrir un flujo inferior.

El artículo de Wikipedia sobre underflow tiene una descripción bastante clara:

"El término flujo inferior aritmético (o" flujo inferior de punto flotante ", o simplemente" flujo inferior ") es una condición en un programa de computadora que puede ocurrir cuando el verdadero resultado de una operación de punto flotante es de menor magnitud (es decir, más cercano a cero) que el valor más pequeño representable como un número de coma flotante normal en el tipo de datos objetivo. El subflujo puede considerarse en parte como desbordamiento negativo del exponente del valor de coma flotante ".

Guffa
fuente
Puede ser útil tener en cuenta que a underflowmenudo se usa específicamente para referirse a la condición particular donde la magnitud de un número es menor que la del valor distinto de cero más pequeño posible, pero mayor que la distancia más pequeña posible entre valores distintos de cero, en otros palabras, casos donde los números caen dentro de lo que el artículo de Wiki llama la "brecha de subflujo". En las implementaciones que cumplen con IEEE-744, el número representable más pequeño es igual a la diferencia representable más pequeña entre los números, por lo que tales flujos no pueden ocurrir, pero fuera del mundo de la PC, no todos los sistemas cumplen con IEEE.
supercat
2

En matemática entera, el desbordamiento se refiere a valores demasiado grandes y demasiado pequeños. En coma flotante, el desbordamiento se refiere a un exponente demasiado grande, y el desbordamiento se refiere a un exponente demasiado pequeño.

De hecho, para los tipos enteros , las CPU no tienen forma de diferenciar entre desbordamiento y desbordamiento. Tome el siguiente complemento de 16 bits:

  0x8000 (unsigned 32768, or signed -32767)
+ 0xFFFF (unsigned 65535, or signed -1)
--------
  0x7FFF (32767, the carried '1' is lost)

El indicador de desbordamiento en la CPU, por supuesto, se establecerá después de esta adición. Usando matemática firmada, el resultado es demasiado pequeño (-32768). Usando matemáticas sin signo, el resultado es demasiado grande (0x17FFF). Dado que la matemática del complemento 2 es idéntica para los tipos con signo y sin signo, overflowse ve obligada a significar valores demasiado grandes y demasiado pequeños.

Nota para uno mismo - piense en un nombre
fuente