Überlauf

Neue Frage »

Auf diesen Beitrag antworten »
Informatikanfänger20 Überlauf

Hallo, es geht um folgenden Code:


code:
1:
2:
3:
4:
5:
6:
7:
public class BytesVerstehen { 
public static void main(String[] args) {
 byte test=127;
 System.out.println(test);
 test++; System.out.println(test); 
}
 }


Wenn ich das ausgeben lasse, wird der Wertebereich von Byte überschritten und -128 ausgegeben. Wie kann man das genau erklären?
Wenn ich mir den Wertebereich wie ein Zahlenstrahl vorstelle, ist dieser kreisförmig und mündet nach 127 in - 128.

Dann habe ich probiert test++ zu ersetzten, mit test=test+1;
Das gibt einen Fehler, das er nicht von int to byte konvertieren kann?
Warum das?


Ich würde mich über Tipps freuen
 
Auf diesen Beitrag antworten »
Informatikanfänger20 RE: Überlauf

Kann mir bitte jmd vllt das erklären;

Dann habe ich probiert test++ zu ersetzten, mit test=test+1;
Das gibt einen Fehler, das er nicht von int to byte konvertieren kann?
Warum das? Gott
Auf diesen Beitrag antworten »
NixJava

Hallo,

die erste Frage hast du dir schon selbst beantwortet. Ein vorzeichenbehaftetes Byte kann nur Zahlen von -128 bis 127 aufnehmen. Daher kommt es zum Überlauf, den man sich als "Ring"-Addition vorstellen kann, wie du es schon erwähnt hast. Dabei wird die 0 als positive Zahl aufgefasst und es kann eine negative Zahl mehr dargestellt werden (127 <-> -128).

Zur zweiten Frage muss ich vorab sagen, dass ich kein Java-Programmierer bin.
Java stellt Konstanten (wie hier die 1) anscheinend als Integer dar. Dort steht also

code:
1:
byte = byte + integer

und endet mit einem Kompilierungsfehler. Dagegen funktioniert der Cast

code:
1:
test=(byte)(test+1)

einwandfrei.
Auf diesen Beitrag antworten »
Informatikanfänger20

Dankeschön für deine Erklärung smile
Eines versehe ich noch nicht ganz:



Zitat:
Original von NixJava
. Dabei wird die 0 als positive Zahl aufgefasst und es kann eine negative Zahl mehr dargestellt werden (127 <-> -128).
Wie ist das mit der 0. Wenn ich test=0 setzen würde, gäbe es das gleiche Problem?
 
Auf diesen Beitrag antworten »
NixJava

Nein, bei der Null tritt kein Über- bzw. Unterlauf auf. Außer man betrachtet ein vorzeichenloses Byte (0..255), das ist hier aber nicht der Fall.

Java speichert vorzeichenbehaftete Zahlen im Zweierkomplement. Dabei gibt das höchstwertige Bit (MSB) an, ob die Zahl positiv oder negativ ist.

0 = 00000000
1 = 00000001
2 = 00000010
3 = 00000011
...

Das höchstwertige Bit (rot markiert) ist jeweils 0, also ist die Zahl positiv. In diesem Kontext wird die Zahl Null als positiv betrachtet (mathematisch ist sie es jedoch nicht).

Bei den negativen Zahlen sieht das anders aus:

-1 = 11111111
-2 = 11111110
-3 = 11111101
...

Jetzt berechnen wir mal 127+1 in einem Byte:

code:
1:
2:
3:
4:
01111111 (127, positiv)
00000001 (1, positiv)
--------
10000000 (-128, negativ)

Das ist eine ganz normale Addition mit Übertrag, wobei das höchstwertige Bit nun 1 ist, die Zahl also negativ!
Auf diesen Beitrag antworten »
Informatikanfänger20

Aha Daumen hoch
Das heißt das höchstwertige Bit ist eine Art Vorzeichenbit. Bei binärer Addition von 127 und 1 wird das höchstwertige Bit wegen den ganzen Überträgen zu 1 und damit negativ behaftet.
Das erste Bit bei positiven Zahlen 0 ist, ist wsl Konvention in Java.
Dann hätte ich noch eine letzte Frage bitte: Wenn ich in meinem Code von Anfang byte test=0 setze und dann wieder test=test+1 schreibe. Warum gibts da dasselbe Konvertierungsproblem? verwirrt
Auf diesen Beitrag antworten »
NixJava

Zitat:
Original von Informatikanfänger20
Dann hätte ich noch eine letzte Frage bitte: Wenn ich in meinem Code von Anfang byte test=0 setze und dann wieder test=test+1 schreibe. Warum gibts da dasselbe Konvertierungsproblem? verwirrt

Meinst du damit den Konvertierungsfehler "integer to byte"? Der Konvertierungsfehler hat in diesem Fall nichts mit dem Überlaufproblem zu tun. Wie oben schon erwähnt, hast du eine Zuweisung

code:
1:
byte = byte + integer

bzw.

code:
1:
[8 Bit] = [8 Bit] + [32 Bit]

und das passt von der Operandengröße nicht. Die Lösung des Problems:

code:
1:
2:
integer test = 0;
test = test+1;

oder

code:
1:
2:
byte test = 0;
test = (byte)(test+1);
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »