Integer Overflow

Chrono

Grünschnabel
Hallo,

mein Problem ist, dass ich einen Integer Overflow bekommen, wenn ich Werte überhalb von 2147483647 benutze. Kann man das irgendwie unterdrücken ohne auf einen anderen Datentyp zu wechseln?
Alle Werte außerhalb des Wertebereichs von Integer sollten nach Möglichkeit dann wieder bei Minus anfangen.
Kann man das irgendwie einstellen?

Gruß
Chrono
 
Genau, was macht es für einen Sinn wenn sie dann wieder bein minus anfangen?
Keinen? :rolleyes:
Alle was die .net Datentypen sprengt musst mit einem eigenen Datentyp abfackeln.
Dafür implementierst die Operatoren (operator)
und berechnest die Größe dann mittels Exponential-Funktionen.
Es gibt bereits einen Datentyp der das kann: C# biginteger Class
 
Also es ist so. Der Benutzer gibt sein Passwort ein und daraus wird eine entsprechende Prüfziffer errechnet. Die Schleife durchläuft so oft, wie das Passwort lang ist. Dann wird immer der ASCII Wert des Buchstaben an welcher Stelle er in der Schleife ist genommen und mit einer anderen Ziffer multipliziert und und zu der bereits aufsummierten Integer Variable hinzuaddiert.
Wenn die Prüfziffer errechnet wurde, wird sie übers Internet an den Server geschickt und dort verglichen.
Fragt mich bitte nicht, warum das so ist. Ich hätte auch lieber nen MD5 oder SHA Algorithmus benutzt. Aber der Server ist nunmal fertig und auch so nichts mehr dran zu ändern.

Das komische nur, in Java funktioniert das ganze, dort erhalte ich wirklich negative Werte!
Dachte man könnte das in VB ebenso realisieren....

Falls nein, werde ich nen Double nehmen und dann per Hand ausrechnen was passiert wäre, wenns nen Overflow gegeben hätte....
 
Hallo,

Christian Kusmanow hat gesagt.:
Genau, was macht es für einen Sinn wenn sie dann wieder bein minus anfangen?
Keinen? :rolleyes:
Nur weil du dir keine Anwendung für dieses Verhalten vorstellen kannst, ist es nicht gleich sinnlos. Also ruhig auch ab und an mal über den Tellerrand gucken ;)

Zum Thema: für solche Fälle gibt es in C# das Schlüsselwort unchecked. Wird ein Block damit eingeleitet, werden dort keine derartigen Ausnahmen mehr geworfen und der Überlauf findet „regulär“ statt.

Alternativ dazu gibt es auch die Compilerschalter /checked und /unchecked, mit denen man das Verhalten global steuern kann.

Weitere Infos finden sich in der MSDN Bibliothek (z.B. hier und dort).

Grüße,
Matthias
 
Och mann, bis jetzt will mir nicht einfallen wo ich sowas gebrauchen könnt ausser das hier:
C#:
unchecked {
	random = new Random( (int) DateTime.Now.Ticks );
}
Kannst mir mal bitte ein sinnvolles Anwendungsbeispiel nennen. :)
Aber alles was über byte hinaus geht.
 
Hallo,

Chrono hat doch schon ein entsprechendes Beispiel gebracht. Viele Hash-Algorithmen arbeiten mit 32-bittigen Ganzzahlen, die an bestimmten Stellen einfach überlaufen können – was somit auch eine Voraussetzung des Algorithmus und essenziell für dessen korrekte Arbeitsweise ist. Natürlich könnte man das in C# auch mit dem Datentyp long und vielen modulo 2³² lösen – aber wieso sollte man, wenn's doch so viel bequemer geht? :)

Grüße,
Matthias
 
Ach jetzt versteh ich's. Leider hab ich mich bisher noch nicht daran gemacht einen solchen
Algorithmus selber zu schreiben. Hab bisher ja nur fertige Dinge in der hinsicht verwendet,
da es keinen Sinn macht mit eigenen Algorithmen aufzuwarten. Sobald sie geknackt werden,
hat man kaum eine Chance das mitzubekommen. Daher die Denkblockade.

Danke Dir.

LG
 
klappt irgendwie nicht. :confused:

Also ich habs mittlerweile in Java / J# hinbekommen und durch eure Lösung mit dem unchecked gehts auch in C#. Finde aber leider kein passendes äquivalent dazu in Visual Basic.
Habe mir den Lutz Roeder's .NET Reflector drauf gemacht und geguckt welche Lösung er mir anbietet. Aber leider ohne erfolg, gibt wohl nichts in Visual Basic dafür :mad:
 
Hallo,

ja, das ist richtig. VB.NET bietet keine zu checked/unchecked äquivalenten Schlüsselwörter an. Die entsprechenden Compilerschalter funktionieren aber auch mit VB.NET.

Grüße,
Matthias
 

Neue Beiträge

Zurück