Weil overflow checking nicht richtig bei Datentypen funktioniert, die kleiner als 32bit sind, da die Rechenoperationen auf den 32bit Registern ausgeführt werden.
Versuch doch mal das:
Delphi-Quellcode:
a := High(Word);
a := a + 1;
Disassembly für die 2. Zeile:
Delphi-Quellcode:
0041A834 0FB745FE movzx eax,[ebp-$02]
0041A838 83C001 add eax,$01
0041A83B 7105 jno $0041a842
0041A83D E836ACFEFF call @IntOver
0041A842 668945FE mov [ebp-$02],ax
jno ist "Jump if not overflow" - und hier gabs nunmal keinen Overflow, denn eax ist 32bit breit. Wenn er in Variable zurückschreibt, spricht er es allerdings nur als 16-bit an (ax).
Schreibst du allerdings statt
a := a + 1;
Inc(a);
, dann gibts nen overflow.
Denn das wird zu
Delphi-Quellcode:
0041A85C 668345FE01 add word ptr [ebp-$02],$01
0041A861 7305 jnb $0041a868
0041A863 E810ACFEFF call @IntOver