2012-04-15 27 views
12

Esto parece una pregunta estúpida, pero parece que no veo la respuesta. Tengo una UInt64, que se supone que tiene un valor máximo deUInt64 y "La operación se desborda al momento de la compilación en el modo comprobado"

UInt64.MaxValue 18446744073709551615 

Sin embargo, cuando intento para asignar un número de tamaño modesto, me sale este error de desbordamiento de "La operación se desborda en tiempo de compilación en modo verificado ". Si yo envuelvo en un bloque "sin control" y luego se compila y se ejecuta como si esta variable es cero:

UInt64 value1 = 1073741824 * 8; // Compile error 
UInt64 value2 = 8589934592;  // Actual value - no error 

Por qué es esto happenning ??

+0

Ahh sí, ¡eso lo explicaría por completo! ¡Gracias chicos! –

Respuesta

23

Porque:

UInt64 value1 = 1073741824 * 8; 

está haciendo la aritmética como un entero de 32 bits con signo, a continuación, convirtiéndola en una ulong. Proveedores:

UInt64 value1 = 1073741824UL * 8; 

El UL significa que el literal es de un largo sin signo. Véase la sección 2.4.4 de la especificación de C# para más información sobre los sufijos literales:

Si el literal es el sufijo UL, UL, UL, UL, LU, Lu, Lu, o lu, que es de tipo ulong

4

1073741824 es un int, no un UInt64.
Por lo tanto, su multiplicación sobrepasa el límite de un entero con signo de 32 bits.

Agregue el sufijo ul (sin signo largo) a cualquiera de los operandos.

1

Tienes un error porque se opera con int en lugar de long 1073741824 sigue siendo int (MAX int es 2147483647).
Por lo tanto, en el primer caso se obtiene un desbordamiento del tipo int.
Cambiar primera expresión con:

UInt64 value1 = 1073741824L * 8; 

y el problema desaparecerá.

+0

no notó que opera con valor sin signo. Para unsigned long debe usar 1073741824UL en lugar de 1073741824L. –

Cuestiones relacionadas