Ausgabewerte?

Status
Nicht offen für weitere Antworten.
L

lackilo

Gast
Hi wollte mal wissen ob mir hier jemand erklären kann weshalb folgende Ausgaben die in den Kommentaren stehenden Werte liefern besonders a|b und a&b !!!

class AusdruckTest {
public static void main(String args[]) {

int a = 2;
int b = 3;

System.out.println(a++ + a - --b); // 3
System.out.println(a | b); // 3
System.out.println(a & b); // 2
System.out.println(a / b + 1); // 2
System.out.println((int) (((float) a) / ((float) b) * 4.0)); // 6
System.out.println((b * 2) % a); // 1

}
}

Danke im Vorraus.

mfg lackilo
 

Campino

Top Contributor
Code:
System.out.println(a++ + a - --b); // 3

a++ //es wird erst der Wert genommen und dann hochgezählt, also ist das 2
+a //hier ist a schon 3, der Wert also 5
- --b //es wird erst b heruntergezählt und dann die Substraktion ausgeführt, daher 5-2

System.out.println(a | b); // 3

/*
bitweises oder...
b=2=10
a=3=11
-----------
e=3=11

Im Ergebnis entstehen 1, wenn einer der beiden Werte an dieser stelle eine 1 hat
*/


System.out.println(a & b); // 2

/*
bitweises und...
b=2=10
a=3=11
-----------
e=2=10

Im Ergebnis entstehen 1, wenn beide Werte an dieser Stelle eine 1 haben
*/

System.out.println(a / b + 1); // 2

// a und b sind int, dass Ergebnis folglich auch, deshalb entsteht keine Kommazahl
// a ist hier 3, b=2 (wegen der esrten Anweisung) 3/2 ist 1,5, die Nachkommastellen fallen wegen dem int weg, dann //noch +1, kommt zwei raus

System.out.println((int) (((float) a) / ((float) b) * 4.0)); // 6

/*Durch das casten (float) werden jetzt auch Nachkommastellen verarbeitet, dann ist 3/2=1.5 und mal 4.0 (auch kommazahl) kommt 6.0 raus. Das Ergebnis ist double (weil 4.0 double ist).*/

System.out.println((b * 2) % a); // 1

/*
b*2 =4, der modulo Operator % gibt den rest bei ganzzahliger Division aus, bei 4/3 ist das 1
4/3= 1 Rest 1
*/

Ich hoffe das ist Verständlich...
 
L

lackilo

Gast
Danke das ging ja schnell ja besonders a|b machte mir Schwierigkeiten auf Binärsystem wär ich da nie gekommen Vielen Dank.
mfg lackilo
 
L

lackilo

Gast
da das so schnell ging hätt ich noch ne Frage zum Casten wann ist es erlaubt zu Casten? Hab ich das richtig verstanden dass es nur erlaubt ist wenn keine Verluste entstehen?
Wenn ja dann versteh ich in kommendem Bsp bei erstens nicht wieso man einen float in einen int casten kann da könnten ja verluste entstehen...oder?

char a;
short b;
int c;
floatd;
double e;

d = a * (float) (b - d) + (int) d; /* erlaubt */
b = a + d / (short) e; /* nicht erlaubt */
e = c * 3; /* erlaubt */

danke schon mal mfg lackilo
 
B

Beni

Gast
Casten ist immer erlaubt, wenn es keine Verluste gibt werden sie aber automatisch durchgeführt.

Wenn du Objekte castest: ob ein Cast funktioniert wird dann erst während der Laufzeit entschieden, und es kann üble Nebenwirkungen geben wenn man was falsch castet...
 
L

lackilo

Gast
ja danke aber ich verstehe immer noch nicht warum im obrigen bsp bei float in int keine aber bei darunter in short eine fehlermeldung (possible loss of precision) kommt....
mfg lackilo
 
B

Beni

Gast
Das ist keine Fehlermeldung, das ist eine Warnung!
Eine Warnung ist lediglich ein Hinweis auf ein mögliches Problem während der Laufzeit.
 
L

lackilo

Gast
ok aber warum kommt hier keine warnung hier könnte ja auch was verloren gehen oder?
d = a * (float) (b - d) + (int) d;
weil d ja ein float wert ist...
 
B

Beni

Gast
Ok, ich hab das jetzt mal kopiert und versucht zu kompilieren. Die Fehlermeldung bei "b = a + d / (short) e; /* nicht erlaubt */" ist "type missmatch".

Das ist ein echter Fehler (vergiss bitte meine letzte Bemerkung, das war eine Verwechslung meinerseits).

Also: das a + d / (short) e ist ein float (wegen dem d), also eine Flieskommazahl. Das b hingegen ist eine Ganzzahl, und die passen nicht zusammen (rechts koennte 1.5 stehen, links geht das nicht).

Bei deinem zweiten Beispiel ist ein char (der ist "weniger" als ein int, und kann umgewandelt werden), ein float und ein int an der Gleichung beteiligt. Weil jede dieser Zahlen als float dargestellt werden kann (wenn auch nicht immer ganz exakt), nimmt der ganze Ausdruck den Typ float an. Und d ist auch ein float, deshalb keine Fehler/Warnungen.
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben