AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

EIntOverflow bei LongWord, nicht aber bei Word

Ein Thema von Der schöne Günther · begonnen am 28. Mai 2018 · letzter Beitrag vom 29. Mai 2018
Antwort Antwort
Seite 1 von 2  1 2   
Der schöne Günther

Registriert seit: 6. Mär 2013
6.212 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

AW: EIntOverflow bei LongWord, nicht aber bei Word

  Alt 28. Mai 2018, 17:19
Kam keine Warnung?
Nö.

Größer als SizeOf(Pointer) werden aber keine automatischen Castes vorgenommen.
Aber es ist doch SizeOf(Pointer) = SizeOf(LongWord) ?


PS: Verhalten bei Win32 und Win64 identisch.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.555 Beiträge
 
Delphi 12 Athens
 
#2

AW: EIntOverflow bei LongWord, nicht aber bei Word

  Alt 28. Mai 2018, 17:41
Ja, aber er würde danach größer sein.
Ich weiß jetzt nicht wie es im 64 Bit ist,
aber in 32 Bit wird maximal bis auf Größe der CPU-Register vergrößert.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.212 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: EIntOverflow bei LongWord, nicht aber bei Word

  Alt 28. Mai 2018, 17:46
Verstehe ich nicht.

Das -9000 nicht im Bereich eines LongWord (0..4 Mrd.) liegt ist mir klar, aber was wird denn hier vergrößert? Bei Word (0..65535) scheint er ja keine Probleme zu haben. Weshalb sollte er hier überhaupt auf einen signed Typen vergrößern?


Und wo wäre so etwas überhaupt dokumentiert?

Und wie komme ich jetzt überhaupt aus der Sache raus? Statt acceptDouble(x-y) ein acceptDouble( (x*1.0) - (y*1.0)) wird ja wohl kaum die richtige Lösung sein...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.555 Beiträge
 
Delphi 12 Athens
 
#4

AW: EIntOverflow bei LongWord, nicht aber bei Word

  Alt 28. Mai 2018, 18:02
Bei dem Word wird der Compiler das einfach schon vorher casten, weil er 32 Bit halt am Liebsten hat.

Delphi-Quellcode:
   acceptDouble(Double(Integer(a) - Integer(b)));

   acceptDouble(Double(x - y));
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

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

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
Der schöne Günther

Registriert seit: 6. Mär 2013
6.212 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: EIntOverflow bei LongWord, nicht aber bei Word

  Alt 28. Mai 2018, 18:15
Ich kann mit Assembler nichts anfangen, glaube das jetzt aber (Weißkittel-Syndrom).

Ist das irgendwo dokumentiert? Wie verhält sich das auf Win64? Wie verhält sich das, sollte ich (Gott bewahre!) etwas auf iOS oder Android kompilieren wollen? Ist das immer noch alles 32 Bit?
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

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

AW: EIntOverflow bei LongWord, nicht aber bei Word

  Alt 28. Mai 2018, 18:20
Ich kann mit Assembler nichts anfangen, glaube das jetzt aber (Weißkittel-Syndrom).

Ist das irgendwo dokumentiert? Wie verhält sich das auf Win64? Wie verhält sich das, sollte ich (Gott bewahre!) etwas auf iOS oder Android kompilieren wollen? Ist das immer noch alles 32 Bit?
Es verhält sich irgendwie, bis es jemand als Bug reported und dann ist dieses Verhalten as designed

Aber mal ehrlich - keine Ahnung.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#8

AW: EIntOverflow bei LongWord, nicht aber bei Word

  Alt 28. Mai 2018, 19:03
Für 16-Bit wird der 'falsche' Opcode benutzt (eigentlich der richtige aber wg. der 32-Bit Arithmetik wird in beiden Fällen das Overflow-Bit nicht gesetzt, also netto falscher Code)
Code:
Unit2.pas.38: a := 1000;
005CE68A 66C745FEE803     mov word ptr [ebp-$02],$03e8
Unit2.pas.39: b := 10000;
005CE690 66C745FC1027     mov word ptr [ebp-$04],$2710
Unit2.pas.40: acceptDouble(a-b);
005CE696 0FB745FE        movzx eax,[ebp-$02]
005CE69A 0FB755FC        movzx edx,[ebp-$04]
005CE69E 2BC2             sub eax,edx
005CE6A0 7105             jno $005ce6a7
005CE6A2 E80595E3FF      call @IntOver
Da OF nicht gesetzt ist, gibt's keinen Int-Overflow. Bei 32-Bitwird nicht OF getestet sondern CF, und das ist in beiden Fällen gesetzt.
Code:
Unit2.pas.44: acceptDouble(x-y); // << EIntOverflow
005CE6CA 8B45F8           mov eax,[ebp-$08]
005CE6CD 2B45F4           sub eax,[ebp-$0c]
005CE6D0 7305             jnb $005ce6d7
005CE6D2 E8D594E3FF       call @IntOver
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#9

AW: EIntOverflow bei LongWord, nicht aber bei Word

  Alt 28. Mai 2018, 18:40
Wie verhält sich das auf Win64?
Ohne es jetzt verifiziert zu haben, wird dort vermutlich weiterhin mit den 32-Bit Registern gerechnet, solange man keine größeren Datentypen verwendet. X86-64 kann in den meisten Fällen ja beides bzw. benötigt sogar explizit ein 64-Bit promotion prefix (REX.W), um die Instructions von der standardmäßig 32-Bit Breite auf 64-Bit umzustellen.

Wie verhält sich das, sollte ich (Gott bewahre!) etwas auf iOS oder Android kompilieren wollen? Ist das immer noch alles 32 Bit?
iOS ist definitiv tatsächlich immer 64-Bit seit einiger Zeit. Bei Android kann ich es dir nicht sagen .. wird vermutlich nicht einheitlich sein.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.212 Beiträge
 
Delphi 10 Seattle Enterprise
 
#10

AW: EIntOverflow bei LongWord, nicht aber bei Word

  Alt 28. Mai 2018, 18:44
Und sich wahrscheinlich alle paar Versionen ändern. Ab sofort traue ich keiner Addition und Subtraktion mehr und nehme für alles die größten Datentypen die ich finden kann.

Nicht wirklich, aber so in etwa.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:49 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz