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

Informatiker Board » Themengebiete » Praktische Informatik » Algorithmen » Überlauf » Antwort erstellen » Hallo Gast [Anmelden|Registrieren]

Antwort erstellen
Benutzername: (du bist nicht eingeloggt!)
Thema:
Nachricht:

HTML ist nicht erlaubt
BBCode ist erlaubt
Smilies sind erlaubt
Bilder sind erlaubt

Smilies: 21 von 33
smileWinkDaumen hoch
verwirrtAugenzwinkerngeschockt
Mit ZungeGottunglücklich
Forum Kloppebösegroßes Grinsen
TanzentraurigProst
TeufelSpamWillkommen
LehrerLOL HammerZunge raus
Hilfe 
aktuellen Tag schließen
alle Tags schließen
fettgedruckter Textkursiver Textunterstrichener Text zentrierter Text Hyperlink einfügenE-Mail-Adresse einfügenBild einfügen Zitat einfügenListe erstellen CODE einfügenPHP CODE farbig hervorheben
Spamschutz:
Text aus Bild eingeben
Spamschutz

Die letzten 7 Beiträge
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);
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
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!
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?
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? Gott
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