PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : java frage


Gast
2004-11-01, 19:19:54
ich habe folgendes problem: gegeben ist dieses kleine prog

class Warum {
public static void main(String[] args) {
byte b = 7;
b += 253;
Out.println(b);
Out.println(10000000*10000000/10000000);
}
}

ausgegeben werden die werte 4 und 27 nur nun soll ich beantworten wieso das so ist nur ich habe absolut keinen plan warum.
würde mich freuen wenn mir jemand helfen könnte thx

Senior Sanchez
2004-11-01, 20:47:45
das erste (b += 253) ist eindeutig eine Bereichsüberschreitung. Wie in jeder Programmiersprache ist es so, dass bestimmten Datentypen einen bestimmten Wertebereich abdecken. Byte tut dies mit einem Byte, was 2^8 zustände ermöglicht. Dieser Wert entspricht 256. Da Byte nur positive Ganzzahlen abdeckt und die 0 auch mit dazu gerechnet wird, so ergeben sich für byte eine Spanne von 0 bis einschließlich 255. Wird nun dieser Wert überschritten, so rechnet Java einfach an der unteren Bereichsgrenze weiter, das heißt. wenn ich zu 253 die Zahl 7 dazu addiere, so rechnet er bis 255, stellt aber fest, dass noch 5 addiert werden müssen. Also addiert er eine eins, kommt zur 0 und addiert jetzt noch den rest, das macht insgesamt 4.

Beim zweiten sollte es so ähnlich sein, denn bei diesen ausdrücken, ohne spezielle kennzeichnung nimmt er diese Werte als int-Werte an. Dadurch kommt wieder eine Bereichsüberschreitung zustande und vor der Teilung durch 1000000 entsteht der wert 276447232. Diesen Wert durch 10000000 ergibt nicht etwa 27,6447232 sondern da in diesem fall mit int gerechnet wurde nur den Wert 27. Es ist sozusagen eine Art modulo rechnen, dass sich aber aus der Verwendung des Datentyps int ergibt.

Btw, dein Quellcode ist falsch. Out ist sicher der Ausgabestream, das sollte aber System.out.println() heißen ;)

Mal ne Frage: wofür musste das eigentlich wissen?

mfg Senior Sanchez

Trap
2004-11-01, 20:53:55
Solche warum-fragen kann man nur durch Nachschlagen im Sprachstandard klären.

Zur 1. Ausgabe: http://java.sun.com/docs/books/jls/second_edition/html/expressions.doc.html#13510 5. Absatz

Zur 2.:
Das ist viel schwieriger zu klären.
Da muss man 1. klären welchen Typ die Konstanten haben: http://java.sun.com/docs/books/jls/second_edition/html/expressions.doc.html#224125
2. klären was bei Überläufen passiert: http://java.sun.com/docs/books/jls/second_edition/html/expressions.doc.html#5036
3. klären welche Operation zuerst durchgeführt wird: hab ich nicht gefunden...
4. klären ob der Compiler einfache Umformungen durchführen darf: http://java.sun.com/docs/books/jls/second_edition/html/expressions.doc.html#23213

Gast
2004-11-01, 21:09:42
danke jungs habt mir weiter geholfen ! der quellcode ist richtig da ich voher noch ne out.class importiert habe die dies richtig stellt. wissen muss ich das weil das ne java aufgabe war die ich für meine java vorlesung braucht, so im groben hatte ich schon ne ahnung wieso die werte ras kommen konte es aber nicht so richtig vormulieren als nochmal vielen dank