Gibt es Programmiersprachen, die einen Überlauf bei primitiven Datentypen erkennen?
-
Ich schätze mal nein, weil das an der HW liegt. Aber wäre ja denkbar, das es eine Sprache gibt, die eine Bereichsüberprüfung durchführt.
-
Ada zum Beispiel.
Und die Hardware kann das natürlich. Die Intel x86er setzen zum Beispiel nach einem Überlauf bei Addition das Carry-Flag, darauf kann man mit einem bedingten Sprung reagieren.
-
C# kann das auch:
http://msdn.microsoft.com/en-us/library/khy08726.aspxU.u. können es auch manche C++ Compiler als non-standard Extension (über #pragmas o.ä. gesteuert könnte ich mir vorstellen).
Bashar schrieb:
Die Intel x86er setzen zum Beispiel nach einem Überlauf bei Addition das Carry-Flag, darauf kann man mit einem bedingten Sprung reagieren.
Es gibt zwei Flags - Carry und Overflow. (Carry für unsigned und Overflow für signed - oder so)
-
Das müsste eigentlich jede Prozessor-Architektur können. Weil wie soll man sonst vernünftige Arithmetik nutzen können. z.B. bei einem 8 Bit-Prozi mit 16 Bit-Zahlen hantieren? Das konnte sogar der C64 mit seiner MOS 6510, wenn ich mich recht erinnere.
-
Assembler.
-
Gibt es Programmiersprachen, die einen Überlauf bei primitiven Datentypen erkennen
smalltalk:
16r3fffffff class. "SmallInteger" (16r3fffffff + 16r00000001) class. "LargePositiveInteger"
automatische Umwandlung in größeren Datentyp, wenn die Rechnung in 31 Bits überläuft
-
Sowas wie Smalltalk oder Lisp hab ich jetzt absichtlich weggelassen, weil gar nicht klar ist, was da ein "primitiver" Datentyp sein soll.
-
SmallIntegers sind beispielsweise in den unteren 31 Bits eines object pointers gespeichert, nehmen also nur endlich viele Werte an und sind nach oben und unten begrenzt => primitiver Datentyp
-
In Eiffel wird (je nach Compiler-Einstellung) zur Laufzeit auf Overflow geprueft.
Die Details kenne ich allerdings nicht.
-
BTW: gibt es nicht bei x86 sogar einen "mach mir nen Interrupt wenn Flag X gesetzt ist" Befehl?
Dann wäre das sogar nur mehr ein einziger Befehl Overhead statt zwei (test + branch).
-
Hi,
hab grad mal nachgesehen, Delphi kann es.
Ist aber standardmäßig nicht gesetzt, weil es die Codegröße und die Ausführungszeit vergrößert.Gruß Mümmel