¿Qué es un error de desbordamiento de enteros?

¿Qué es un error de desbordamiento de enteros? ¿Por qué me preocupa ese tipo de error? ¿Cuáles son algunos métodos para evitarlo o evitarlo?

El desbordamiento de entero ocurre cuando intentas express un número que es más grande que el número más grande que puede manejar el tipo entero.

Si intentas express el número 300 en un byte, tienes un desbordamiento de enteros (el máximo es 255). 100.000 en dos bytes es también un desbordamiento de enteros (65.535 es el máximo).

Debe preocuparse porque las operaciones matemáticas no se comportarán como espera. A + B en realidad no es igual a la sum de A y B si tiene un desbordamiento de enteros.

Lo evita al no crear la condición en primer lugar (generalmente eligiendo su tipo de entero para que sea lo suficientemente grande como para que no se desborde, o limitando la entrada del usuario para que no ocurra un desbordamiento).

La forma más fácil de explicarlo es con un ejemplo trivial. Imagina que tenemos un entero sin signo de 4 bits. 0 sería 0000 y 1111 sería 15. Entonces, si incrementa 15 en lugar de obtener 16, dará la vuelta a 0000, ya que 16 es en realidad 10000 y no podemos representarlo con menos de 5 bits. Desbordamiento Ergo …

En la práctica, los números son mucho más grandes y circula a un gran número negativo en overflow si el int está firmado, pero lo anterior es básicamente lo que sucede.

Otra forma de verlo es considerarlo, en gran medida, lo mismo que ocurre cuando el cuentakilómetros de su automóvil vuelve a cero después de alcanzar 999999 km / mi.

Cuando almacena un número entero en la memoria, la computadora lo almacena como una serie de bytes. Estos pueden ser representados como una serie de unos y ceros.

Por ejemplo, cero se representará como 00000000 (enteros de 8 bits) y, a menudo, 127 se representará como 01111111 . Si agrega uno a 127, esto “volteará” los bits, y lo intercambiará a 10000000 , pero en una representación complementaria de dos estándar , esto se usa realmente para representar -128. Esto “desborda” el valor.

Con números sin signo, sucede lo mismo: 255 ( 11111111 ) más 1 se convertiría en 100000000 , pero como solo hay 8 “bits”, esto termina en 00000000 , que es 0.

Puede evitar esto haciendo una correcta verificación de rango para su tamaño entero correcto, o usando un lenguaje que maneje las excepciones correctamente para usted.

Se produce un error de desbordamiento de enteros cuando una operación genera un valor entero mayor que su máximo.

Por ejemplo, si el valor máximo que puede tener es 100000 y su valor actual es 99999, agregar 2 lo hará ‘desbordamiento’.

Debería preocuparse por los desbordamientos de enteros porque los datos pueden modificarse o perderse involuntariamente, y puede evitarlos con un tipo de entero más grande (consulte int largo en la mayoría de los idiomas) o con un esquema que convierta largas cadenas de dígitos en enteros muy grandes.

Me gustaría ser un poco contrario a todas las otras respuestas hasta el momento, que de alguna manera aceptan malas palabras rotas como algo dado. La pregunta está etiquetada como independiente del idioma y en un gran número de idiomas, los números enteros simplemente nunca se desbordan, así que aquí está mi tipo de respuesta sarcástica:

¿Qué es un error de desbordamiento de enteros?

Un artefacto obsoleto de las épocas oscuras de la informática.

¿Por qué me importa?

Tu no

¿Cómo se puede evitar?

Use un lenguaje de progtwigción moderno en el que los enteros no se desborden. (Lisp, Scheme, Smalltalk, Self, Ruby, Newspeak, Ioke, Haskell, elige …)

El desbordamiento ocurre cuando el resultado de una operación aritmética no cabe en el tipo de datos de la operación. Puede tener un desbordamiento con un entero sin signo del tamaño de un byte si agrega 255 + 1, porque el resultado (256) no cabe en los 8 bits de un byte.

Puede tener un desbordamiento con un número de coma flotante si el resultado de una operación de coma flotante es demasiado grande para representarse en el exponente o mantisa del tipo de datos de coma flotante.

También puede tener underflow con tipos de coma flotante cuando el resultado de una operación de coma flotante es demasiado pequeño para representarlo en el tipo de datos de coma flotante dado. Por ejemplo, si el tipo de datos de coma flotante puede manejar exponentes en el rango de -100 a +100, y cuadra un valor con un exponente de -80, el resultado tendrá un exponente alrededor de -160, que no cabrá en el tipo de datos de coma flotante dado.

Debe preocuparse por los desbordamientos y subdesbordamientos en su código, ya que puede ser un asesino silencioso: su código produce resultados incorrectos, pero es posible que no indique un error.

Si puede ignorar los desbordamientos de forma segura depende en gran medida de la naturaleza de su progtwig: la representación de los píxeles de la pantalla de los datos 3D tiene una tolerancia mucho mayor para los errores numéricos que, por ejemplo, los cálculos financieros.

La comprobación de desbordamiento a menudo se desactiva en la configuración predeterminada del comstackdor. ¿Por qué? Debido a que el código adicional para verificar el desbordamiento después de cada operación requiere tiempo y espacio, lo que puede degradar el rendimiento en tiempo de ejecución de su código.

Hazte un favor y al menos desarrolla y prueba tu código con la verificación de desbordamiento activada.

De la wikipedia :

En la progtwigción de computadoras, se produce un desbordamiento de enteros cuando una operación aritmética intenta crear un valor numérico que es más grande de lo que se puede representar dentro del espacio de almacenamiento disponible. Por ejemplo, agregar 1 al valor más grande que se puede representar constituye un desbordamiento de enteros. El resultado más común en estos casos es que se almacenen los bits representables menos significativos del resultado (se dice que el resultado se ajusta).

Debería preocuparse por esto, especialmente al elegir los tipos de datos adecuados para su progtwig, o podría tener errores muy sutiles.

De http://www.first.org/conference/2006/papers/seacord-robert-slides.pdf :

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. Los desbordamientos pueden ser firmados o no.

PD: el PDF tiene una explicación detallada sobre desbordamientos y otras condiciones de error de enteros, y también cómo abordarlos / evitarlos.

Esto sucede cuando intenta utilizar un número entero para un valor que es más alto que la estructura interna del entero puede admitir debido a la cantidad de bytes utilizados. Por ejemplo, si el tamaño entero máximo es 2.147.483.647 e intenta almacenar 3.000.000.000, obtendrá un error de desbordamiento de número entero.