2010-01-29 16 views
10

Los documentos de la API dice¿Se desborda BigInteger alguna vez?

Todos los detalles en la especificación referentes desbordamiento son ignorados, como BigIntegers se hacen tan grandes como sea necesario para dar cabida a los resultados de una operación.

¿Esto implica que BigInteger nunca se desbordará suponiendo que tiene suficiente memoria disponible? Si es así, ¿por qué permitimos que un "tipo" se desborde y otros no?

A medida que evoluciona el lenguaje, ¿favorecerá los tipos que ocultan el mecanismo de desbordamiento de los programadores?

Respuesta

12

BigInteger nunca se desbordará suponiendo que tiene suficiente memoria para manejarlo.

Para responder a su pregunta de por qué dejamos que algunos tipos de desbordamiento y no otros:

BigInteger no es realmente un tipo. Es una clase. Es una clase contenedora diseñada para darle la misma funcionalidad que una int, pero le permite usar números tan grandes como necesite sin la preocupación de desbordamiento.

Los tipos se desbordan porque son simplemente un par de bytes (la cantidad exacta depende del tipo) de memoria, y una vez que esa pequeña cantidad de memoria se desborda, también lo hacen los números.

Ninguna clase "se desborda" a menos que esté específicamente diseñada para hacerlo (o si se le agotan los recursos). Una clase se define con suficiente memoria para todo lo que contiene, que en su mayoría serían referencias a otras clases u otras estructuras de datos.

2

¡BigInteger nunca se desborda! Es de un tamaño arbitrario, por lo que puede acomodar un número tan grande como su memoria (y el montón de Java) puede acomodar.

5

Usted read it right, nunca se desbordará. Aunque, no creará más RAM para ti :)

semántica de las operaciones aritméticas exactamente similares a los de número entero operadores aritméticos de Java, como se define en La especificación del lenguaje Java. Para el ejemplo , la división por cero arroja un ArithmeticException, y la división de un negativo por un positivo produce un residuo negativo (o cero). Todos se ignoran los detalles en la especificación relativa al desbordamiento , ya que los BigIntegers están hechos tan grandes como sea necesario para para acomodar los resultados de una operación .

2

Correcto, BigInteger nunca se desborda, utiliza operaciones de software y asignación dinámica para almacenar números de tamaño arbitrario.

Como con todas las cosas en la informática, el "tamaño arbitrario" es otra manera de decir "hasta que se agoten los recursos en el sistema subyacente".

2

Si es así, ¿por qué dejamos que un "tipo" se desborde y otros no?

Eso depende completamente de cómo se respalda. Si está respaldado, por ejemplo, por una primitiva simple de vainilla int, obviamente se desbordará en Integer.MAX_VALUE. Los primitivos tienen bordes de desbordamiento claros, mientras que los de Objetos dependen de cómo están respaldados/programados.