19 votos

¿por qué este sería el resultado en tiempo de desbordamiento de enteros

He comprobado el documento que long= int64 rango de más de 900,000,000,000,000

Aquí está mi código:

int r = 99;
long test1 = r*r*r*r*r;

en tiempo de ejecución se me da 919,965,907 en lugar de la correcta 9,509,900,499.

otra prueba

long test2 = 99*99*99*99*99;

Se niega a compilar, diciendo desbordamiento de enteros.

Pero si hago esto

long test3 = 10100200300;

Esto funciona bien.

47voto

JohnD Puntos 6811

El problema es que, el literal "99" es tratado como un int. Si usted añadir "L" va a tratar como a largo. Para solucionar su problema de compilación:

long test2 = 99L * 99L * 99L * 99L * 99L;

Y para solucionar el "resultado incorrecto" provocada por el desbordamiento de entero:

long r = 99;
long test1 = r * r * r * r * r;

El punto clave es que la expresión a la derecha del "=" se evalúa antes de la asignación a long r está hecho.

Hay otros literal sufijos que usted podría estar interesado en:

Type    Suffix    Example
uint    U or u    100U
long    L or l    100L
ulong   UL or ul  100UL
float   F or f    123.45F
decimal M or m    123.45M

@m.edmonson, respecto a su pregunta acerca de por qué sale a 919965907. Lo que sucede, es que el valor es "envolver" alrededor de int.MaxValue. Usted puede ver esto con un pequeño programa de prueba:

int i = 99; // 99
i *= 99;    // 9801
i *= 99;    // 970299
i *= 99;    // 96059601
i *= 99;    // 919965907        should be 9509900499 but comes out to 919965907
            //                      which is (9509900499 % int.MaxValue)

long k = 9509900499 % int.MaxValue;

¿Qué se entiende por "envolver"? Cuando se supera int.MaxValue por 1, el valor de "vuelve" a int.MinValue.

int j = int.MaxValue;
j++;

bool isNowMinValue = (j == int.MinValue);   // true, the value has "wrapped around"

Esto es un poco simplista; si la búsqueda para "integer overflow" obtendrá una mejor explicación. Vale la pena comprender cómo enteros (y otros tipos numéricos) están representados con 32 bits:

http://en.wikipedia.org/wiki/Signed_number_representations

5voto

Tim Rodham Puntos 78

Es el uso de enteros multiplicación :

long r = 99;
long test1 = r*r*r*r*r;

4voto

xanatos Puntos 30513

Como otros han dicho, pero:

long test2 = 99L * 99 * 99 * 99 * 99;

Esto le dará el resultado correcto con menos L todo :-)

Esto sucede porque la primera 99L es un long, de modo que todas las multiplicaciones son realizadas en la long "campo" y todos los demás enteros son upcasted a long antes de la multiplicación (claramente la multiplicación siempre está entre 2 números y de izquierda a derecha, así que es como (((99L * 99) * 99) * 99) * 99 y cada "parcial" es un resultado de largo y hace que el siguiente operando a ser convertidos a largo).

3voto

tonycoupland Puntos 1614

Su segunda prueba falla porque cada 99 es un número entero; reemplazarla con la siguiente y se compila.

long test2 = 99L * 99L * 99L * 99L * 99L;

Ver el MSDN Largo de la Documentación para más detalles.

1voto

Leons Puntos 1966

El compilador está mirando 99 como los números enteros, aunque el resultado final será largo.

Esto va a funcionar.

long test2 = 99L*99L*99L*99L*99L;

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X