auto. Typenkonvertierung

usrr

Bekanntes Mitglied
Hallo,

wird z.B. "floatvar / 10" automatisch vom Compiler in "floatvar / 10f" konvertiert, oder hat man einen damit während der Laufzeit immer einen kleinen Geschwindigkeitsverlust?
 

faetzminator

Gesperrter Benutzer
Java:
public class Test {
    public static void main(String[] args) {
         float f1 = 1.4f;
         System.out.println(f1 / 10);
         float f2 = 1.4f;
         System.out.println(f2 / 10f);
    }
}
->
Code:
[faetzminator@fkaros ~]$ javac -version
javac 1.6.0_26
[faetzminator@fkaros ~]$ javap -c Test
Compiled from "Test.java"
public class Test extends java.lang.Object{
public Test();
  Code:
   0:	aload_0
   1:	invokespecial	#1; //Method java/lang/Object."<init>":()V
   4:	return

public static void main(java.lang.String[]);
  Code:
   0:	ldc	#2; //float 1.4f
   2:	fstore_1
   3:	getstatic	#3; //Field java/lang/System.out:Ljava/io/PrintStream;
   6:	fload_1
   7:	ldc	#4; //float 10.0f
   9:	fdiv
   10:	invokevirtual	#5; //Method java/io/PrintStream.println:(F)V
   13:	ldc	#2; //float 1.4f
   15:	fstore_2
   16:	getstatic	#3; //Field java/lang/System.out:Ljava/io/PrintStream;
   19:	fload_2
   20:	ldc	#4; //float 10.0f
   22:	fdiv
   23:	invokevirtual	#5; //Method java/io/PrintStream.println:(F)V
   26:	return

}
 

jamesv

Bekanntes Mitglied
Hallo,
kann mir jemand von euch erklären, was das ist, der Beitrag von faetzminator?

Code:
[faetzminator@fkaros ~]$ javac -version
javac 1.6.0_26
[faetzminator@fkaros ~]$ javap -c Test
Compiled from "Test.java"
public class Test extends java.lang.Object{
public Test();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return

public static void main(java.lang.String[]);
Code:
0: ldc #2; //float 1.4f
2: fstore_1
3: getstatic #3; //Field java/lang/System.out:Ljava/io/PrintStream;
6: fload_1
7: ldc #4; //float 10.0f
9: fdiv
10: invokevirtual #5; //Method java/io/PrintStream.println:(F)V
13: ldc #2; //float 1.4f
15: fstore_2
16: getstatic #3; //Field java/lang/System.out:Ljava/io/PrintStream;
19: fload_2
20: ldc #4; //float 10.0f
22: fdiv
23: invokevirtual #5; //Method java/io/PrintStream.println:(F)V
26: return

}

Dankeschön.
 

jamesv

Bekanntes Mitglied
Die einzigen Unterschiede, die ich sehe sind:

anstatt
fstore_1

gibt es

fstore_2


Dies halt auch für fload.

sollte ich andere Unterschiede erkennen?
 

jamesv

Bekanntes Mitglied
Wenn das der exakte Befehlssatz ist, dann müsste es einen Unterschied geben zwischen float/int und float/float. Habe ich mein Hirn richtig eingeschaltet? Sorry, aber ich mache sowas zum ersten Mal habt ihr eventuell noch ein paar erklärende Links dazu die ich mir unbedingt anschauen sollte?

Vielen Dank :)
 

Ogofo

Mitglied
Die Ursprüngliche Frage war ja ob aus einr "floatvar / 10" vom compiler eine "floatvar / 10f" gemacht wird. Sprich ob die Ganzzahl 10 von Compiler automatisch in eine Fließkommazahl umgewandelt wird (typecasting).

In dem Java Quelltext sieht man nun eine Division mit einer Ganzzahl 10 und eine mit einer Fließkommazahl 10f. Wenn man sich nun anschaut was der Compiler daraus macht sieht man das er bei beiden Divisionen eine Fließkommazahl verwendet, also automatisch die Ganzzahl umgewandelt hat.

Der Rest des Codes dort oben sind die Befehle die die JVM aufruft. Die könnte man nun nachschlagen (sind aber recht selbsterklärend ^^)
 
H

hüteüberhüte

Gast
Mich würde das auch mal interessieren, ob die Typkonvertierung zur Übersetzungszeit oder zur Laufzeit geschieht. Ein einfaches Ja bzw. Nein würde reichen
 
H

hüteüberhüte

Gast
Ok :D

Das bedeutet auch mehr Freiheit für den Programmierer, Blödsinn zu schreiben, ohne dass das Programm langsamer ist, weil der Compiler vorher alles "wegoptimiert"... :bahnhof:
 
Zuletzt bearbeitet von einem Moderator:

Noctarius

Top Contributor
Also viele Dinge (z.B. diese Typenkonvertierung) aber auch Autoboxing und Unboxing (primitive -> wrapper, wrapper -> primitive) macht der Compiler (bei letzteren beiden werden z.B. Methodenaufrufe zu Integer.valueOf(...) und Integer.intValue() im Bytecode hinterlegt) gemacht. Andere Dinge macht erst die JVM.

Der Compiler kann relativ viel schon zur Compile-Time auflösen, der wichtige Vorteil bei statisch typisierten Sprachen. Hier sind fast alle Informationen die benötigt werden schon im Sourcecode vorhanden.
 
H

hüteüberhüte

Gast
Also viele Dinge (z.B. diese Typenkonvertierung) aber auch Autoboxing und Unboxing (primitive -> wrapper, wrapper -> primitive) macht der Compiler (bei letzteren beiden werden z.B. Methodenaufrufe zu Integer.valueOf(...) und Integer.intValue() im Bytecode hinterlegt) gemacht. Andere Dinge macht erst die JVM.

Aber Moment, ein Cast kann doch erst zur Laufzeit ausgeführt werden, oder etwa nicht?
 

Noctarius

Top Contributor
Nein, ein Cast ist ein Opcode op_cast für Klassen und bei Zahlenwerten wird oft mit Tricks gearbeitet. Z.B. kannst du aus einem Integer einen float machen Integer.floatValue() usw. Aber richtig, viele Casts werden auch erst zur Laufzeit ausgeführt (Autoboxing aber gerade nicht, das gibt es nämlich eigentlich nicht und ist nur Compiler-Magic ;)).
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Blndner Auto Beispiel Java Basics - Anfänger-Themen 4
Igig1 Autoparkplatz verkettete Liste erstes und letztes Auto Java Basics - Anfänger-Themen 13
K Ein Objekt Auto kennt den Inhalt seines links und rechtsstehenden Autos, wie soll man das ermöglichen Java Basics - Anfänger-Themen 2
F Auto String mit Array Name aus Datei... oder so ähnlich Java Basics - Anfänger-Themen 4
E Klassen Auto Klasse Java Basics - Anfänger-Themen 6
P Klassen In einer Autoklasse das Objekt Auto mittels Collection Speichern Java Basics - Anfänger-Themen 4
T Erste Schritte Auto betanken Java Basics - Anfänger-Themen 3
B Klassen Programm für einen Auto Boardcomputer Java Basics - Anfänger-Themen 20
A Auto bewegen (mit SuM) Java Basics - Anfänger-Themen 27
B ""fahrendes Auto"" Java Basics - Anfänger-Themen 14
N Arraylist Auto sortieren Java Basics - Anfänger-Themen 7
Private Void Auto-Aktualisierung der Zeitanzeige Java Basics - Anfänger-Themen 10
A Auto-Updater Java Basics - Anfänger-Themen 4
C Auto tanken Java Basics - Anfänger-Themen 6
P Typenkonvertierung Java Basics - Anfänger-Themen 1
M nach Typenkonvertierung Leerzeichen ersetzen Java Basics - Anfänger-Themen 2
R Typenkonvertierung ohne Typkonvertierung :) Java Basics - Anfänger-Themen 12
egrath Automatische Typenkonvertierung Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben