Einzelnen Beitrag anzeigen

Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.009 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#8

AW: EIntOverflow bei LongWord, nicht aber bei Word

  Alt 28. Mai 2018, 18:08
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
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie (28. Mai 2018 um 18:16 Uhr)
  Mit Zitat antworten Zitat