2010-06-24 15 views
11

Tengo un bucle for que sigue incrementando un valor entero hasta que el bucle se completa. Entonces, si el límite n es una variable doble y la variable incrementada 'i' es un número entero, se incrementa más allá de sus límites.Incrementando un valor entero más allá de su límite entero - C#

double total = 0; 
double number = hugetValue; 
for (int i = 1; i <= number; i++) 
{ 
    total = total + i; 
} 
return total; 

¿Qué le sucede a 'i' si excede su capacidad? ¿Cómo cambia el valor de i? ¿Recibiré un error de tiempo de ejecución?

Gracias

NLV

+1

¿Qué idioma? – sharptooth

+0

Editado el título. – NLV

+1

Agregué la etiqueta C# a la pregunta. Para algunas personas (es decir, al menos para mí) eso es más útil. SO le permite filtrar dentro/fuera según las etiquetas, y puede obtener listas de preguntas basadas en una etiqueta. La mayoría de las veces solo miro las etiquetas específicas que me interesan y cada una de ellas con tanta frecuencia obtengo una lista de las preguntas más recientes independientemente de la etiqueta. –

Respuesta

8

Similar al comportamiento en algunas implementaciones de C donde un int se ajusta desde INT_MAX a INT_MIN (aunque en realidad es un comportamiento indefinido según el estándar ISO), C# también se ajusta. Probarlo en VS2008 con:

int x = 2147483647; 
if (x+1 < x) { 
    MessageBox.Show("It wrapped..."); 
} 

dará como resultado la aparición del cuadro de mensaje.

Si su hugetValue es mayor que el valor máximo de int, entonces su ciclo se ejecutará para siempre debido a esto.

Por ejemplo, si se trata de 2147483648, al igual que usted piensa que está recibiendo cerca de ella, los int se envuelve alrededor de 2147483647 de nuevo a -2147483648 y el bucle simplemente sigue en marcha.

+0

Escribí en C#. Perdón por no mencionar eso. No entiendo tu respuesta. – NLV

+0

@NLV: Algunos son para C#. – leppie

+0

@NLV: He editado la pregunta para incluir la etiqueta C#. Tenga en cuenta que en muchas preguntas el lenguaje es importante (algunos permiten la conversión implícitamente, otros no lo permiten en tiempo de compilación). Al hacer una pregunta, mientras más información proporcione, dentro de términos razonables, mejor. –

3

Disculpas si esto parece grosero, pero usted aprenderá mucho más al tratar de usted mismo.

Editado: aha, entonces lo intentó y obtuvo resultados inesperados. Como se ha explicado en otros lugares, los lenguajes tipo C tienden a envolver silenciosamente la aritmética de enteros. Eso es en realidad un comportamiento bastante razonable en general si el costo de verificar el desbordamiento es alto. Una vez que sepa que esto puede suceder, uno de los códigos cuidadosamente, especialmente mirando para el tipo de constructo en su ejemplo.

+0

Lo tomó en el sentido correcto. De hecho, lo probé y me quedé atrapado en un ciclo infinito. Cuando lo depuré, vi que el valor de i era negativo. Me preguntaba por qué no arrojar un error y en su lugar estaba continuando el ciclo. ¿Alguna razón para eso? – NLV

+0

Aquí hay dos problemas diferentes, por qué la conversión arroja un número negativo y por qué el compilador no se queja con la condición de que el valor sea negativo. Lo último es lo más simple: podría estar modificando la variable de bucle dentro del bucle y haciendo que sea negativo. Detectar si esto sucede o no es un problema demasiado complejo para que lo intente el compilador, por lo que se supone que usted sabe lo que quiere (o lo encontrará pronto cuando esté atascado en su bucle infinito) –

2

Si desea una excepción, proporcione la opción del compilador checked o utilice la construcción checked que se proporciona en C#.

+0

Solo para citar una fuente: http://msdn.microsoft.com/en-us/library/a569z7k8.aspx Básicamente todas las operaciones están desmarcadas, a menos que esté usando constantes en ambos lados, que se verifican en tiempo de compilación. –