Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Themengebiete » Praktische Informatik » Algorithmen » Überlauf » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen Überlauf
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Informatikanfänger20
unregistriert
Überlauf Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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
18.11.2017 12:03
Informatikanfänger20
unregistriert
RE: Überlauf Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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
18.11.2017 19:42
NixJava
unregistriert
Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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.
18.11.2017 19:52
Informatikanfänger20
unregistriert
Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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?
18.11.2017 20:13
NixJava
unregistriert
Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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!
18.11.2017 21:17
Informatikanfänger20
unregistriert
Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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
18.11.2017 22:37
NixJava
unregistriert
Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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);
20.11.2017 12:08
Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
Informatiker Board » Themengebiete » Praktische Informatik » Algorithmen » Überlauf