2012-04-02 15 views
7

En java, sé que el tipo de datos del resultado de un cálculo aritmético depende de los tipos de datos de los números involucrados en el cálculo. Por ejemplo,tipo de dato de los resultados del cálculo aritmético java

  1. int + int = int

  2. largo/doble = doble

a. Pero no puedo encontrar ninguna referencia que pueda darme todas estas reglas. ¿Alguien podría ayudarme?

b. ¿Cómo evitar el exceso de flujo en el cálculo aritmético? Por ejemplo, los resultados de 2 largos pueden no encajar en un largo más ...

Muchas gracias.

Respuesta

3

a. Estas reglas se llaman reglas de promoción numérica y se especifican en Java Language Specification

b. Hay dos métodos generalmente aceptados para tratar los desbordamientos.

El primer método, una verificación posterior, donde realiza una operación, diga además y luego verifique que el resultado sea mayor que cualquiera de los operandos. Por ejemplo:

int c = a + b; 

if(c<a) { // assuming a>=0 and b>=0 
    // overflow happened 
} 

El segundo método, es un pre-registro, en el que básicamente intenta evitar el desbordamiento suceda en primer lugar. Ejemplo:

if(a > Integer.MAX_INTERGER - b) { 
    // overflow happened 
} 
+2

Su primer cheque no siempre es válido. Si b es negativo, 'c

+0

Eso es verdad. Añadiré eso al ejemplo. Pero solo estoy ilustrando el enfoque, no dando una solución infalible. –

+0

Ya, sé que no es una solución completa. Solo quería señalar eso para que el póster no lo tomara al pie de la letra. –

2

La sección específica de la especificación del lenguaje Java que se ocupa de estas reglas es section 4.

Si no desea que los valores se desborden, utilice un BigInteger o algún otro tipo de aritmética de precisión arbitraria.

para evitar desbordamientos en el caso general, Guava (que contribuyo a) proporciona métodos como IntMath.checkedAdd(int, int) y LongMath.checkedMultiply(long, long), que arrojan excepciones en desbordamiento. (Algunos de ellos no son triviales para implementarse, pero estos son todos muy exhaustivamente probados.) Puede ver la fuente para ver cómo funcionan, pero la mayoría de ellos confían en lindos trucos para verificar el desbordamiento de manera eficiente.

1

El resultado de una operación aritmética sobre cualquiera de los dos operandos enteros primitivos habrá al menos un int - incluso si los operandos son bytes y corto.

Cuestiones relacionadas