Me parece recordar que estaba leyendo eso
underflow
significa que tiene una magnitud demasiado pequeña que ya no se puede presentar en un tipooverflow
significa 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
underflow
significa que tiene un valor demasiado pequeño que ya no se puede presentar en un tipooverflow
significa 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?
terminology
Johannes Schaub - litb
fuente
fuente
INT_MIN - 1
oINT_MAX + 1
Respuestas:
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:
La nota al pie dice:
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 - 1
yINT_MAX + 1
. En ambos casos, simplemente no hay suficiente espacio en elint
tipo 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 - 1
establecerá 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á.
fuente
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:
fuente
underflow
menudo 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.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:
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,
overflow
se ve obligada a significar valores demasiado grandes y demasiado pequeños.fuente