![]() |
AW: EIntOverflow bei LongWord, nicht aber bei Word
Zitat:
Zitat:
|
AW: EIntOverflow bei LongWord, nicht aber bei Word
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. |
AW: EIntOverflow bei LongWord, nicht aber bei Word
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:
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.
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
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 |
AW: EIntOverflow bei LongWord, nicht aber bei Word
Würde ich definitiv als Compiler-Bug einstufen.
|
AW: EIntOverflow bei LongWord, nicht aber bei Word
Das ist doch bestimmt seit 20 Jahren so. Den Bug behebt sicher keiner mehr.
Eine Warnung wäre bei so etwas vielleicht auch angebracht, aber wir wissen ja: Zitat:
|
AW: EIntOverflow bei LongWord, nicht aber bei Word
Bei
Delphi-Quellcode:
kommt die Überlaufmeldung. Dann wird auch korrekt mit 16 Bit Registern gerechnet.
a := 1000;
b := 10000; dec(a, b); acceptDouble(a);
Code:
0041C554 66C7051C484200E803 mov word ptr [$0042481c],$03e8
0041C55D 66C7051E4842001027 mov word ptr [$0042481e],$2710 0041C566 66A11E484200 mov ax,[$0042481e] 0041C56C 6629051C484200 sub [$0042481c],ax 0041C573 7305 jnb $0041c57a 0041C575 E84E8EFEFF call @IntOver |
AW: EIntOverflow bei LongWord, nicht aber bei Word
Nja, per se kann eine x86-CPU mit 16 und 8 Bit-Werten rechnen, aber wie bereits erkannt, castet Delphi oftmals schon vorher und die Überlaufprüfung spricht nicht an, wenn für die mathematischen Operationen dann die 32-Bit-Befehle verwendet werden.
Es gibt von Android noch 32 Bit OS, aber so wie es aussieht wird seit einiger Zeit von den meisten "größeren" Herstellerung scheinbar nur noch 64 Bit verwendet. Der Vorteil eines OS mit nur noch einem Layer wäre ja eine kleinere Codebasis und dass Programme von der Bittigkeit dann überall laufen Also 64 Bit-Apps welche in reinen 32 OS bekanntlich nicht laufen. Bzw. Es ist dann nicht nötig, dass dann unnötig viele Varianten eines Programms in einer APK liegen, wenn man überall die beste Performance haben will. 32 Bit ARM 64 Bit ARM 32 Bit Intel (x86) 64 Bit Intel (x86) vv 64 Bit ARM 64 Bit Intel (x86) In neueren Intel-Androids werden ja nun auch ARM-only-Apps (armeabi) ausgeführt. Gut, das ist nicht sonderlich schnell, aber für kleine Apps, ohne große CPU-Auslastung, spart das nochmal Speicherplatz. Uns interessiert es ja noch nicht, da Delphi aktuell eh nur 32 Bit für Android anbietet. Und Intel von Delphi noch garnicht unterstützt wird. Da ist nur ein blöder ARM-Dummy drin, welcher eine Fehlermeldung anzeigt, mit dem Ergebnis, dass Delphi-Apps standardmäßig überall starten, aber selbst wenn das Android/Intel ARM emulieren kann, dort dennoch nichts läuft, weil der Emulator nicht anspringt, so lange der Dummy in der API rumgammelt. Und Dank des ARM-Dummy listet der PlayStore diese Apps für Intel-Geräte auf, obwohl sie dann doch nicht ausgeführt werden können. |
AW: EIntOverflow bei LongWord, nicht aber bei Word
@himitsu, ist das oft vorkommende "x68" ein Tippfehler für "x86" oder habe ich das falsch verstanden und kenne es einfach noch nicht?
|
AW: EIntOverflow bei LongWord, nicht aber bei Word
jupp
|
AW: EIntOverflow bei LongWord, nicht aber bei Word
Übrigens: LongWord ist nicht auf allen Plattformen 32bit - siehe
![]() Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:32 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