2010-04-14 20 views
12

¿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?¿Qué es un error de desbordamiento de enteros?

+8

Es como cuando se usa una botella de 1 litro cuando se prueba con poco más de 1 litro de líquido. – mjv

+0

@mjv: ... sin mencionar los errores (y desorden) que se producen al verter botellas de litro y botellas de un cuarto de galón ... – FrustratedWithFormsDesigner

+5

@mjv, excepto que su botella no aparecerá repentinamente vacía. – zdan

Respuesta

15

Desbordamiento de enteros cuando intenta expresar un número que es más grande que el número más grande que puede manejar el tipo entero.

Si intentas expresar 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 suma de A y B si tiene un desbordamiento de enteros.

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

0

De wikipedia:

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

Le conviene especialmente cuando selecciona los tipos de datos adecuados para su programa o puede obtener errores muy sutiles.

+0

esto responde a qué pero no a por qué y cómo – David

-1

Esto ocurre 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.

+0

Overflow es un artefacto de operaciones matemáticas, no de asignación/almacenamiento. – dthorpe

0

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

Un número entero de desbordamiento se produce cuando un entero es aumentado más allá de su valor máximo o disminuyó más allá de su valor mínimo. Los desbordamientos se pueden firmar o no.

P.S .: El PDF tiene una explicación detallada sobre los desbordamientos y otras condiciones de error entero, y también cómo abordarlos/evitarlos.

1

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

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

Debería importar desbordamientos de enteros porque los datos pueden cambiarse o perderse inadvertidamente 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 a muy grandes enteros.

7

La manera 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, se redondeará nuevamente a 0000, ya que 16 es en realidad 10000 y no podemos representarlo con menos de 5 bytes. Ergo desbordamiento

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

Otra forma de ver esto es considerar como gran parte de la misma cosa que sucede cuando el odómetro en su coche se da la vuelta a cero de nuevo después de golpear 999.999 kilometros se produce/mi

+0

"menos de 5 bits", no "menos de 5 bytes". – indiv

2

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 standard two's compliment, esto se usa para representar -128. Esto "desborda" el valor.

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

Usted puede evitar esto al hacer un correcto control de rango para su tamaño entero correcto, o al usar un lenguaje que maneje las excepciones adecuadamente para usted.

+0

'10000000' es INT_MIN (p. Ej., -128 para 1 byte con signo) en el cumplido de 2. -1 es 'FFFFFFFF'. – indiv

1

Me gustaría ser un poco contrario a todas las otras respuestas hasta el momento, que de alguna manera aceptan malas palabras rotas como un hecho. La pregunta está etiquetada como independiente del idioma y en un gran número de idiomas, los 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 la edad oscura de la informática.

¿por qué me importa?

Usted no lo hace.

¿cómo se puede evitar?

Utilice un lenguaje de programación moderno en el que los enteros no se desborden. (Lisp, Scheme, Smalltalk, Self, Ruby, Newspeak, Ioke, Haskell, elija ...)

1

Desbordamiento es 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 representarlo en el exponente o mantisa del tipo de datos de coma flotante.

Puede también tiene desbordamiento con tipos de punto flotante cuando el resultado de una operación de punto flotante es demasiado pequeña de representar 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 porque 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 programa: la representación de píxeles de la pantalla de datos 3D tiene una tolerancia mucho mayor para errores numéricos que, por ejemplo, cálculos financieros.

La comprobación de desbordamiento a menudo se desactiva en la configuración predeterminada del compilador. ¿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 comprobación de desbordamiento activada.

+0

+1 para "hazte un favor". –

Cuestiones relacionadas