Pregunta

Considere la posibilidad de este

        int i = 2147483647;
        var n = i + 3;
        i = n;

        Console.WriteLine(i);           // prints -2147483646    (1)
        Console.WriteLine(n);           // prints -2147483646    (2)
        Console.WriteLine(n.GetType()); // prints System.Int32   (3)

Estoy confundido con el siguiente

  • (1) ¿cómo podría int mantener el valor -2147483646 ?(int rango = - 2.147.483.648 a 2.147.483.647)
  • (2) ¿por qué esta impresión -2147483648 pero no 2147483648 (compilador debe decidir el mejor tipo int rango de supera)
  • (3) si se convierte en algún lugar, ¿por qué n.GetType() da el Sistema.Int32 ?

Edit1: Hecha la corrección:Ahora usted conseguirá Lo que estoy Consiguiendo.(lo siento por eso)

var n = i + 1;a

var n = i + 3;

Edit2: Una cosa más, si como desbordamiento, ¿por qué es una excepción, no se levanta ?

Además: como el desbordamiento se produce, no es de la derecha para establecer el tipo de

var n

en la declaración var n = i + 3; para otro tipo de consecuencia ?


usted es bienvenido para sugerir un mejor título, ya que esto no hace sentido....a mí al menos

Gracias

¿Fue útil?

Solución

Actualización:Cartel fija su pregunta.

1) Esto es, se espera que la producción ya que agrega de 3 a int.MaxValue provocando un desbordamiento.En .RED por defecto, esta es una operación legal desactivada código dando una envoltura alrededor de la a valores negativos, pero si se añade un checked bloque de todo el código se generará una OverflowException en su lugar.

2) El tipo de una variable declarada con var se determina en tiempo de compilación, no en tiempo de ejecución.Es una regla que la adición de dos Int32s da un Int32, no UInt32, Int64 o algo más.Así que, aunque en tiempo de ejecución se puede ver que el resultado es demasiado grande para un Int32, todavía tiene que devolver un Int32.

3) no se convierten a otro tipo.

Otros consejos

 1)  -2147483646 is bigger than -2,147,483,648
 2) 2147483648 is out of range
 3) int is an alias for Int32

1)
En primer lugar, el valor de la variable no es -2147483646, es -2147483648. Ejecutar la prueba de nuevo y comprobar el resultado.

No hay ninguna razón por la que un int no pudo mantener el valor -2147483646. Es dentro de la gama -2147483648..2147483647.

2)
El compilador elige el tipo de datos de la variable a ser el tipo del resultado de la expresión. La expresión devuelve un valor entero, e incluso si el compilador elegiría un tipo de datos mayor para la variable, siendo la expresión devuelve un int y se obtiene el mismo valor que resultado.

Es la operación en la expresión que se desborda, no es cuando el resultado se asigna a la variable que se desborda.

3)
No es convertida en cualquier lugar.

  1. Este es un desbordamiento , su número envuelve alrededor y se fue negativa
  2. Esto no es el trabajo del compilador, como un bucle en tiempo de ejecución puede causar lo mismo
  3. int es un alias o System.Int32 son equivalentes en .NET.

Esto es debido a la representación de bits

se utiliza Int32 pero lo mismo pasa con char (8 bits)

el primer bit tiene el signo, a continuación, los siguientes bits tienen el número

por lo que con 7 bits puede representar 128 números 0111 1111

cuando intenta el número 129, 1000 0001, los bits de signo consiguen el sistema para que el ordenador piensa que es -1 en lugar

Las operaciones Arithmic en .NET no cambian el tipo real.
Se empieza con un entero (32 bits) y la 3 no va a cambiar eso.

Por eso también se obtiene un número redondo inesperada al hacer esto:

int a = 2147483647;
double b = a / 4;

o

int a = 2147483647;
var b = a / 4;

para el caso.

Editar :
No hay una excepción porque .NET desborda el número.
La excepción de desbordamiento sólo ocurrirá en las operaciones de asignación o como explica Mark cuando se establece las condiciones para generar la excepción.

Se puede hacer esto más fácil de todos nosotros usando la notación hexadecimal.

No todo el mundo sabe que el octavo primo de Mersenne es 0x7FFFFFFF

apenas Sayin

Si desea una excepción a ser lanzado, escribir

abc = checked(i+3)

lugar. Que comprobará en busca de desbordamientos.

Además, en C #, el ajuste por defecto es no lanzar excepciones de desbordamientos. Sin embargo, puede cambiar esa opción en algún lugar de las propiedades de su proyecto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top