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
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?
18.11.2017 19:42
NixJava unregistriert
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
Dankeschön für deine Erklärung
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
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.
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).
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
Aha
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?
18.11.2017 22:37
NixJava unregistriert
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?
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: