Datentypen Sonderbehandlung primitiver Datentypen, fixe Konstanteninterpretation

Sae1962

Mitglied
Hallo allerseits!

Ich bin wohl ein etwas erfahrener Javaprogrammierer, da ich schon an die zwei Jahre in Javaprojekten involviert war. Wenn man etwas länger verwendet - und es gibt sicherlich hier Teilnehmer, die über zehn Jahre Erfahrung haben - kommen manchmal Fragen zu den Grundlagen auf.

In Java sind so wie in anderen Sprachen mathematische Operatoren definiert. Diese können auf die primitiven Datentypen
Code:
int
,
Code:
long
, und
Code:
double
angewendet werden, die ja nicht wirklich objektorientiert sind, da keine Klassen. Allerdings gibt es die arithmetischen Operation
Code:
+
,
Code:
-
,
Code:
*
, und
Code:
/
nicht wirklich für die primitiven Datentypen
Code:
byte
und
Code:
short
. So wird bei einer speichermäßig minimalistischen Anwendung ein
Java:
 byte significantsAfterDecimal = 4;
 byte significantsBeforeDecimal = 1;
 byte significants = significantsAfterDecimal - significantsBeforeDecimal;   // Fehler!

nicht akzeptiert. Dasselbe gilt für den Typ
Code:
short
. Um die Operation auszuführen, wandelt der Übersetzer die Werte in diesem Falle in ein int um. Da das Resultat wieder ein
Code:
int
ist, muss man den speichermäßig größeren Wert selbst in den erwünschten Typen zurück umwandeln, also
Java:
 byte significants = (byte)(significantsAfterDecimal - significantsBeforeDecimal);
Ähnlich gibt es "Missverständnisse" mit dem Übersetzer, wenn man
Java:
 float length = 4.3;   // Fehler!
schreibt, da blindlings die Konstante als einen
Code:
double
sieht und deshalb eine Umwandlung oder Bezeichnung notwendig ist:
Java:
 float length = 4.3f;   // an Stelle von (float)4.3;
Ähnlich ist es in C#, wo ich gerade ein Projekt abgeschlossen habe.

Frage:
Warum können oder wollen die Übersetzer nicht mit manchen primitiven Datentypen operieren? Gibt es ein "Tao" dahinter, warum der Übersetzer bzgl. Datentyp einer Konstante voreingenommen ist?

Ich suche nach konkreten Antworten, die diese auch begründen können. Vermutungen habe ich selber auch. :D

Danke für die Auskunft!

PS: Ich habe im Web nach meiner Frage gesucht, aber nichts befriedigendes gefunden.
 
S

SlaterB

Gast
bei Ganzzahltypen klappt die Werteprüfung,
abgesehen davon dass man an einem Long-Wert immer l ranschreiben muss, ob für eine int-Variable oder long,

4.3 in einer float-Variablen gespeichert ist was anderes als 4.3 als double,
da in Binärdarstellung ähnlich zu runden ist wie 1/3 = 0.3333333 in Dezimalschreibweise,

freilich meckert der Compiler auch bei exakten Zahlen wie 4.25, so genau wird da nicht extra geprüft..

Java:
public class Test {
    public static void main(String[] args)  {
        byte b = 105;
        // byte b2 = 305; // geht nicht
        long c = 490589048590l;

        float f = 4.3f;
        double d = 4.3;
        System.out.println(d - f); // relativ große Differenz
        float f2 = 4.25f;
        double d2 = 4.25;
        System.out.println(d2 - f2); // 0
    }
}

-------

dass Java in int rechnet ist glaube ich einfacher für die maschinelle Umsetzung (int = 32bit),
als Gesetzmäßigkeit letztlich auch von Vorteil für den Programmierer, der dann weiß dass es keine byte-Überläufe usw. gibt

am Ende wieder von selber auf byte casten, zumindest wenn die Grenzen sicher erhalten bleiben,
wäre vielleicht nett, aber (jetzt eine Vermutung) könnte für den Compilier zu viel sein,
er müsste extra die beteiligten Variablen anschauen, prüfen ob sie nicht zwischendurch verändert wurden,

er müßte das Ergebnis praktisch im Voraus berechnen, also alle mathematische Funktionalität integriert haben
(Verrechnen wäre fatal, davon können Millionen abhängen, ob Geld oder Menschen)
statt einfach nur die Syntax zu prüfen und bei Rechenzeichen 'Rechnung' anzunehmen, was deutlich leichter ist

für Instanzattribute/ sonstiges hochvariables fällt die Prüfung eh aus,

als Entlastung ist anzumerken, dass der/ manche Compiler ähnliches doch schon prüft,
Unreachable Code, 'Null pointer access' in Eclipse
 
S

SlaterB

Gast
ein weiterer Spezialfall ist, was hier gerade ein Thema ist:
http://www.java-forum.org/java-basi...m-addition-geht-langform-scheitert-typen.html

Java:
int x = 4; char b = 'a';
 
b += x; // geht
b = b + x; // geht nicht
+= geht selbst mit großen Zahlen zum Überlauf, sogar mit double, da ist einfach eingebaut dass nicht geprüft wird,
während beim zweiten wieder erst eine Interpretation fällig wäre, ob es wenigstens direkt dem += entspricht
 

Sae1962

Mitglied
Danke für die Antwort!

Man könnte aber auch die "fehlenden" Operationen hinzufügen und (z.B. bei einem 32-Bit-Prozessor) gleich vier Rechnungen in einem Streich durchführen, wenn man mit
Code:
byte
rechnet. Bei
Code:
short
wären es dann zwei auf einem Schlag.

Ich finde es nur historisch interessant, dass einerseits die Prozessoren sehr wohl die Möglichkeit anbieten, dass mehrere kleinere Zahlen als die Datenbusbreite auf einmal berechnet werden können, man sich aber offensichtlich nicht die Mühe gemacht hat, dies in die Übersetzer (Java, C, C#, usw.) zu nutzen.

Ich wäre für eine Erweiterung, was auch eine Vereinheitlichung der Operationen auf primitiven Datentypen wäre. Und Ausnahmen machen das Verständnis komplizierter. Zugegeben: so eine Erweiterung müsste vorerest gründlich getestet werden - funktional, leistungsmäßig, etc. Aber sie scheint mir trotzdem gar nicht abwegig, sondern eher naheliegend.
 
G

Gonzo17

Gast
Java:
public class Test {

	public static void main(String[] args) {
		new Test(1);
	}

	public Test(byte b) {
	}

}

Warum gibt er hier eigentlich folgenden Fehler:
Code:
The constructor Test(int) is undefined
? Und wie kann das umgehen außer mit einem
Code:
new Test((byte)1);
.
 
G

Gast2

Gast
Jede Zahl die in deinem Quellcode steht ist für Java erstmal nen int. Hier müsstest du explizit casten, oder dir nen zweiten Konstruktor anlegen:

Java:
public Test(int i) {
  this((byte)i);
}
Damit versteckst du den cast dann natürlich nur und es kann zu hier zu ner Exception kommen.
 
G

Gonzo17

Gast
Hat hierzu keiner weiteres Wissen?

Bei mir persönlich geht es jetzt zB schlicht darum, dass ich eine Android App entwickeln wollte und mir dachte, dass es eventuell sinnvoll wäre byte statt int zu verwenden wo es möglich und sinnvoll ist. Oder ist schon der Gedanke falsch? Wenn Java jetzt immer erst ein int annimmt und ich casten muss, dann geht mir der Effekt, dass ich eigentlich weniger Speicher reservieren will, im ersten Moment doch flöten, oder? Außerdem ist es hässlich, wenn ich in jedem Konstruktor casten muss, wundert mich, dass das nicht besser geht..
 
S

SlaterB

Gast
für lokale Variablen/ Parameter kannst du dir solche Sparversuche wohl sparen, falls du nicht per Rekursion an die Grenzen des Stacks gehen willst,
für die Heap dürften nur Instanzvariablen interessant sein und auch dann eher wenn du ein großes Array hast als einzelne Variablen,

warum es so ist, zumal
> byte b = 105;
geht, kann ich nicht sagen, aber bevor hier gar nichts steht die Vermutung äußern,
dass die Methodenbindung doch bisschen was anderes als eine einfache lokale Variablendeklaration ist,

ich nehme kühn an, dass das irgendwie in getrennten Compiler-Schritten stattfindet,
und damit ist im ersten Schritt die Wert-Typermittlung bei int zu Ende gegangen, beim zweiten dann nicht mehr zu drehen,
mit entsprechenden Aufwand sollte es wohl technisch möglich sein, aber alles hat seine Grenzen
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
SHasteCode Datentypen Überlauf primitiver Datentypen Java Basics - Anfänger-Themen 4
S Primitiver Datentyp Short , Vorteil/Nachteil Betrachtung Java Basics - Anfänger-Themen 6
F Primitiver Lucas-Lehmer-Test hängt sich auf Java Basics - Anfänger-Themen 7
R Datentypen Das Verhalten von Strings als Datentypen Java Basics - Anfänger-Themen 7
T Unterschiedliche Datentypen - worin abspeichern? Java Basics - Anfänger-Themen 18
N Verschiedene Konstruktoren mit gleichen Datentypen Java Basics - Anfänger-Themen 8
J Einige Anfängerfragen (Datentypen, Wertebereich) Java Basics - Anfänger-Themen 11
thor_norsk Datentypen unter Java Java Basics - Anfänger-Themen 3
T Datentypen Eigene Datentypen Java Basics - Anfänger-Themen 15
T for-each-Schleife, verschiedene Datentypen Java Basics - Anfänger-Themen 1
G Methoden Methoden mit versch. Datentypen Java Basics - Anfänger-Themen 1
Nicolex3 Größere Datentypen Java Basics - Anfänger-Themen 35
FelixN Array mit verschiedene Datentypen als Rückgabewert? (Long und Double) Java Basics - Anfänger-Themen 3
mihe7 Von Datentypen und (mehrdimensionalen) Arrays Java Basics - Anfänger-Themen 4
P Datentypen, Klassen, Operatoren, Wrapperklassen Java Basics - Anfänger-Themen 2
W Vergleiche bei generischen Datentypen Java Basics - Anfänger-Themen 7
D Eingabe einscannen, ohne vorher einen Datentypen anzugeben? Java Basics - Anfänger-Themen 1
M Datentypen Generische Datentypen - Syntax Java Basics - Anfänger-Themen 25
L Binären Bäume für beliebige Datentypen Java Basics - Anfänger-Themen 15
L Datentypen Ausgabe von eigenem Datentypen Java Basics - Anfänger-Themen 2
T Datentypen Kann Java 2 verschiedene Datentypen vergleichen? Java Basics - Anfänger-Themen 2
A Datentypen Unterschiedliche Datentypen in einer Eingabe einlesen Java Basics - Anfänger-Themen 2
Queiser Datentypen 2 generische Datentypen für eine Schnittstelle Java Basics - Anfänger-Themen 1
S Datentypen Java Basics - Anfänger-Themen 14
Antegra Tekkrebell Primitive Datentypen Literal 8072 Java Basics - Anfänger-Themen 21
N Array gleiche Datentypen zusammenrechnen Java Basics - Anfänger-Themen 28
S Datentypen Java Basics - Anfänger-Themen 4
S generische methode mit verschiedenen datentypen Java Basics - Anfänger-Themen 3
H wählen des kleinstmöglichen Datentypen für Gleitkommazahlen. Java Basics - Anfänger-Themen 2
S Datentypen Java Basics - Anfänger-Themen 2
S Datentypen Abstrakte Datentypen Java Basics - Anfänger-Themen 0
J Zusammenhang Numbers und nummerische Datentypen Java Basics - Anfänger-Themen 2
F Variablen unterschiedlicher Datentypen Java Basics - Anfänger-Themen 6
A Abstrakte Datentypen - Methode delete Java Basics - Anfänger-Themen 6
J Generics Datentypen vergleichen Java Basics - Anfänger-Themen 16
D Spezifikation abstrakter Datentypen Java Basics - Anfänger-Themen 3
W Datentypen Datentypen vergleichen Java Basics - Anfänger-Themen 4
B JAVA Datentypen/Überlauf Java Basics - Anfänger-Themen 4
I Erste Schritte HILFE bei Datentypen Java Basics - Anfänger-Themen 2
J Wertebereiche und Datentypen Java Basics - Anfänger-Themen 12
N Methode mit 2 Datentypen. Fehler? Java Basics - Anfänger-Themen 1
N Probleme mit Datentypen Java Basics - Anfänger-Themen 6
S Datentypen Unterschied elementare und zusammengesetzte/strukturierte Datentypen Java Basics - Anfänger-Themen 5
L Beliebigen Datentypen aus String parsen Java Basics - Anfänger-Themen 6
M Wann eine Wrapper Klasse verwenden und wann einen primitiven Datentypen? Java Basics - Anfänger-Themen 8
K new / Datentypen Java Basics - Anfänger-Themen 3
S Datentypen und ihre Größe Java Basics - Anfänger-Themen 21
T Variablen Varargs und beliebige Datentypen Java Basics - Anfänger-Themen 7
G Wertebereiche bei Datentypen Java Basics - Anfänger-Themen 10
G Erste Schritte Über verschiedene Datentypen iterieren. Gibt es sowas? Java Basics - Anfänger-Themen 19
SheldoN Gibt es größere Datentypen als long? Java Basics - Anfänger-Themen 2
S Abfrage Objekt-Array nach Datentypen Java Basics - Anfänger-Themen 6
B Variablen Wie macht man eine call by reference mit primitiven Datentypen in Java? Java Basics - Anfänger-Themen 2
H Mehrer Datentypen aus einer Methode ausgeben. Java Basics - Anfänger-Themen 25
O Array mit unterschiedlichen Datentypen ausgeben... Java Basics - Anfänger-Themen 16
A Generische Datentypen Java Basics - Anfänger-Themen 8
R Input/Output verschiedene Datentypen als Bytes in Datei speichern Java Basics - Anfänger-Themen 15
T ArrayList mit verschiedenen Datentypen verhindern Java Basics - Anfänger-Themen 8
N Bedingung für Datentypen Java Basics - Anfänger-Themen 3
R Array aus verschiedenen Datentypen Java Basics - Anfänger-Themen 29
J Datentypen Datentypen Java Basics - Anfänger-Themen 7
S Datentypen Array fill Methode - unterschiedliche Datentypen Java Basics - Anfänger-Themen 6
H null und primitive Datentypen Java Basics - Anfänger-Themen 6
N ArrayList mit eigenem Datentypen Java Basics - Anfänger-Themen 3
B Wie kann ich unterschiedliche Datentypen in einem Feld abbilden? Java Basics - Anfänger-Themen 5
S Datentypen Die verschiedene Java Datentypen [Anfänger] Java Basics - Anfänger-Themen 8
M Frage zu Datentypen Java Basics - Anfänger-Themen 4
B Welcher Feld Typ für verschiedene Datentypen? Java Basics - Anfänger-Themen 4
O Rückgabewert mit unterschiedlichen Datentypen Java Basics - Anfänger-Themen 10
S Nicht Primitive Datentypen Java Basics - Anfänger-Themen 5
C Verwendung von primitiven Datentypen Java Basics - Anfänger-Themen 8
Spin Eigenen Abstrakten Datentypen Java Basics - Anfänger-Themen 28
J Datentypen Rechnen mit unterschiedlichen Datentypen Java Basics - Anfänger-Themen 3
B Wieviele bits belegen die Datentypen? Java Basics - Anfänger-Themen 2
S Alle Datentypen in byte Array und zurückwandeln Java Basics - Anfänger-Themen 2
C Explizite und implizite Datentypen Java Basics - Anfänger-Themen 12
F primitive Datentypen, String, Klassen Java Basics - Anfänger-Themen 16
Povlsen84 HashSet mit eigenen Datentypen Java Basics - Anfänger-Themen 6
J Verschieden Datentypen in ein "Array" Java Basics - Anfänger-Themen 13
M HashMap mit primitiven Datentypen Java Basics - Anfänger-Themen 10
SebSnake Operatoren für eigene Datentypen Java Basics - Anfänger-Themen 3
G Frage zum Ungang mit Generische Datentypen Java Basics - Anfänger-Themen 4
G Überladen von Konstruktoren mit unterschiedlichen Datentypen Java Basics - Anfänger-Themen 4
R datentypen konvertierung u modulorechnung Java Basics - Anfänger-Themen 15
G primitive Datentypen als Referenz an eine Methode übergeben Java Basics - Anfänger-Themen 2
G Wertebereiche und Datentypen Java Basics - Anfänger-Themen 3
W Datentypen in JAva Java Basics - Anfänger-Themen 2
G verschiedene datentypen in arraylist Java Basics - Anfänger-Themen 14
N Problem mit Tastatureingaben für verschiedene Datentypen Java Basics - Anfänger-Themen 3
I Array für verschiedene Datentypen? Java Basics - Anfänger-Themen 5
E Eigenen datentypen erstellen Java Basics - Anfänger-Themen 14
Y Neuen Datentypen erstellen Java Basics - Anfänger-Themen 12
M int toString Datentypen Umwandeln, AnfängerProblem Java Basics - Anfänger-Themen 3
M Datentypen zu erzeugen? Java Basics - Anfänger-Themen 2
S Switch für komplexe Datentypen? Java Basics - Anfänger-Themen 7
7 Datentypen Java Basics - Anfänger-Themen 8
S Array mit mehreren Datentypen Java Basics - Anfänger-Themen 5
D String in einen primitiven datentypen parsen Java Basics - Anfänger-Themen 3
F Einlesen von verschieden Datentypen Java Basics - Anfänger-Themen 15
G Verschiedene Datentypen in Vector packen und zurück Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben