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:
code:
1:
2:
integer test = 0;
test = test+1;
oder
code:
1:
2:
byte test = 0;
test = (byte)(test+1);
Informatikanfänger20
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?
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.
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!
Informatikanfänger20
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?
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.
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?
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?