Arithmetische Überlauf oder wie kommt nur diese Zahl zustande?

 

Manchmal testet man doch das erstellte Javaprogramm (oder in einer anderen Programmiersprache geschrieben) und stellt fest, dass die auf dem Bildschirm ausgegebenen Zahlen nicht stimmen können. Woran kann es liegen?

Ist die zu berechnende Formel korrekt?

Werden von Java/ der gewählten Programmiersprache etwa Rechengesetze mißachtet?

All diese Fragen sind abgecheckt und mit „alles ok“ beantwortet, doch die falschen Zahlen bleiben. Eine weitere Fehlerquelle könnte ein falsch verwendeter Datentyp sein – was auch in vorliegendem Programm die Ursache war.

In Java gibt es acht verschiedene primitive Datentypen und jeder hat seinen Wertebereich (in anderen Programmiersprachen können es mehr sein, aber auch hier hat jeder Datentyp seinen Wertebereich).

Datentyp Wertebereich
boolean true oder false
char 16-Bit-Unicode Zeichen bzw. (0x0000 … 0xFFFF)
byte -27 bis 27-1 bzw. (-128 … 127)
short -215 bis 215-1 bzw. (-32.768 … 32.767)
int -231 bis 231-1 bzw. (-2.147.483.648 … 2.147.483.647)
long -263 bis 263-1 bzw. (-9.223.372.036.854.775.808 … 9.223.372.036.854.775.807)
float 1,40239846E-45f … 3,40282347E+38f
double 4.94065645841246544E-324 … 1,79769131486231570E+308

Dieser muss berücksichtigt werden, denn ansonsten entsteht eben das Phänomen des arithmetische Überlaufs.

 

Was ist das eigentlich?

 

Bei der Deklaration einer Variablen wird dieser ein primtiver Datentyp zugeordnet. So weiß der Computer wieviel Speicherplatz er für diese Variable reservieren muß und damit wie groß die Zahl höchstens werden kann. Die Zahl selber wird als 2er-Komplement abgespeichert, d.h. als Bits in 0 und 1.

Kommt es nun durch eine Rechenoperation eine größere Zahl als vorher angegeben wurde entsteht aufgrund des 2er-Komplements eine negative Zahl.

 

Beispiel:

1 Byte ist darstellbar als 0000 0001

2 Byte ist darstellbar als 0000 0010

3 Byte ist darstellbar als 0000 0011

4 Byte ist darstellbar als 0000 0100

127 Byte ist darstellbar als 0111 1111 -> die vorderste Null steht für das Vorzeichen

0 entspricht einer positiver Zahl und 1 entspricht einer negativen Zahl

Addition von 1 bzw. 0000 0001 ergibt 1000 0000.

Unter Beachtung des Vorzeichenbits (1000 0000), wobei 1 einer negativen Zahl entspricht, ist nicht die positive Zahl 128 sondern die negative Zahl -128 entstanden.

 

Wie kann ich das Problem lösen?

Es gibt zwei Möglichkeiten.

  1. Begrenzung der möglichen Eingaben
  2. Ändern des genutzen primitiven Datentyps in einen höherwertigen

 

 

Wenn noch Fragen sind, schreibt sie in die Kommentare.

 

Bis demnächst,

Sperling

Advertisements