2012-04-18 15 views
14

considerar:¿Por qué "i: = i + 1" no da un error de verificación de rango para enteros y tipos más grandes?

{$R+} 
i:= 1; 
While i > 0 do 
    i:= i + 1; 
ShowMessage(IntToStr(i)); 

Si Declaro i como byte, palabra o Shortint TinyInt me sale un error de rango-cheque, como se esperaba. Si declaro i como LongWord, Cardinal, Integer, LongInt o Int64 solo pasa por el ciclo while y muestra el valor negativo o 0, que i obtiene al pasar el límite superior.

¿Delphi 7 no es compatible con la comprobación de rango para números de 32 y 64 bits?

Respuesta

13

La operación i + 1 en realidad no produce un error de comprobación de rango. La operación de asignación lo hace.

Delphi evalúa la constante '1' como un Entero y por lo tanto el lado derecho producirá un resultado que es un Int64 o un Entero (el mayor de i es tipo y entero).

Si ampliamos la línea de salida se obtiene la siguiente

temp := i + 1 
i := temp 

temperatura será ya sea 32 o 64 bits, y se desbordará si llega al límite superior. En el momento en que hacemos la tarea, tenemos un valor de 32 o 64 bits perfectamente válido, por lo que no hay posibilidad de una falla de verificación de rango si tengo 32 bits o más.

Si tengo menos de 32 bits, se aumentará la comprobación del rango si la temperatura es demasiado grande para caber.

Para i> = 32 bits, se puede coger el error de desbordamiento de este modo:

{$R+,Q+} 
... 
+0

Gracias por su explicación que ayudó con alguna dirección. Hice algunas pruebas más, en lugar de agregar i + 1, agregué i + j con i yj del mismo tipo. Esto resultó en el mismo problema. Entonces, yo diría que el operador "+" hace que el resultado sea un número entero. Aunque parezca extraño: si utilizo Inc (i), no importa qué tipo use, no obtengo un error de comprobación de rango. Encontré el {$ Q +} para darme una excepción de desbordamiento de enteros. –

+0

Lo siento, sí, debería haber sido una Q, no una O :) – JamesT

+2

Así que al final estaba usando la herramienta incorrecta para el trabajo y debería haber estado buscando un desbordamiento en lugar de una verificación de rango. –

Cuestiones relacionadas