Jetzt einiges zu den Variablen:
Wenn wir wollen, dass der Computer sich etwas "merkt", brauchen wir etwas, worin dieses etwas abgespeichert wird, damit es verarbeit werden kann: Eine Variable. Es gibt dabei verschiedene Typen von Variablen und zudem mit unterschiedlichen Datenbereichen.
Datentypen werden in zwei Gruppen gegliedert:
Alles, was im Computer irgendwie gespeichert und verarbeitet wird, wird in Binärcode übersetzt (sogar auch die Programme, wie wir bereits gelernt haben). Bei positiven ganzen Zahlen2) mag das etwas einfach sein, denn zu jeder Zahl gibt es ja die Binärdarstellung…
Ganze Zahlen werden im Zweierkomplement repräsentiert.3)
Beispiel:
`23 = 1*2^4 + 0*2^3 + 1*2^2 + 1*2^1 + 1*2^0 = 10111 `
Die verschiedenen Datentypen zur Repräsentation ganzer Zahlen unterscheiden sich in der Anzahl der verwendeten Bits.
-1 als byte:
`-1*2^7 + 1*2^6 + 1*2^5 + 1*2^4 + 1*2^3 + 1*2^2 + 1*2^1 + 1^2*0 = 11111111 `
Dabei wird das erste der 8 Bits4) 5) negativ gedeutet. Naja, soviel Theorie reicht erst einmal, hier ein kleiner Überblick:
Typname | kleinster Wert | größter Wert | Länge |
---|---|---|---|
byte | -128 | 127 | 8 Bits |
short | -32768 | 32767 | 16 Bits |
int | -2147483648 | 2147483647 | 32 Bits |
long | -9223372036854775808 | 9223372036854775807 | 64 Bits |
Die Frage ist nun: Wie werden Zahlen (wie die 3 und die 4 im ersten Bespiel) 6) repräsentiert, z.B. 4711?
Antwort: Wenn nicht anders angegeben, dann immer als int
!
Dies kann zu Problemen führen, wenn die Literalkonstante (also die Zahl) einen Wert ausserhalb von int
repräsentiert.
Probiere folgende Anweisung aus:
System.out.println( 9223372036854775807 );
Welche Fehlermeldung wird ausgegeben? 7) Wann? 8).
Wie kann man dies verhindern? Durch Hinzunahme von L
bzw. l
wird ein Ganzzahlliteral als long-Zahl betrachtet.
System.out.println( 9223372036854775807L );
Motivation
Hier wird statt der Ganzzahlen ein Datentyp für Gleitkommazahlen12) benötigt. Java bietet hierzu die Datentypen float
und double
:
Auch hier ein Überblick über die interne Repräsentation 32 bzw. 64 Bit im IEEE 754 Standard:
Typname | größter positiver Wert | kleinster positiver Wert | Länge |
---|---|---|---|
float | ≈3.40282E+38 | ≈1.40129E-45 | 32 Bits |
double | ≈1.79769E+308 | ≈4.94065E-324 | 64 Bits |
Literalkonstanten für Gleitkommazahlen können bestehen aus:
E
bzw. e
und einer evtl. vorzeichenbehafteten Ziffernfolge,f
, F
, d
oder D
) zur Charakterisierung des Datentyps.Wichtig ist allerdings, dass zur Unterschiedung von ganzen Zahlen mindestens der Dezimalpunkt, der Exponent oder die Endung vorhanden sein muss. Dabei gilt:
double
.Eine korrekte Ausgabe für unser Beispiel von oben erhalten wir demnach mit:
System.out.println(1.0/10.0);
Manchmal wollen wir nicht mit Zahlen sondern mit einzelnen Buchstaben oder Zeichen arbeiten. Hierfür bietet Java den Datentyp char
.
Daten vom Typ char
werden intern mit 16 Bits dargestellt.
Jedem Zeichen entspricht intern eine gewisse Zahl zwischen 0 und 216-1, der sogenannte Unicode.
Dem Buchstaben 'A'
entspricht beispielsweise die Zahl 65, 'B'
→ 66, usw..
Wie sieht nun die Literalschreibweisen für char aus?
Auch hier gibt es verschiedene Möglichkeiten:
'A'
, '?'
\u
gefolgt von vier hexadezimalen Ziffern. So kann 'A'
als '\u0041'
13) geschrieben werden.Literal Zeichen | |
---|---|
'\n' | Zeilentrenner (new line, line feed) |
'\r' | Wagenrücklauf (carriage return) |
'\t' | Tabulator |
'\f' | Seitenvorschub (form feed) |
'\b' | Löschzeichen (backspace) |
'\\' | Backslash \ |
'\'' | einfaches Hochkomma ' |
'\"' | doppeltes Hochkomma " |
'\0' | Nullzeichen |
Interessant ist nun Folgendes:
Probiere einmal diesen Code aus:
int c; c = 'A'; System.out.println(c);
Und? Überrascht? Warum ist dies so? Und warum klappt das überhaupt?
Da char
-Werte ganzen Zahlen entsprechen, ist eine Zuweisung an int
-Variablen möglich.
Durch
int c; c = 'A';
erhält die Variable c
den Wert 65
.
Mehrere Zeichen des Datentyps char
können zu einer Zeichenkette (String
) zusammengefasst werden.
Damit Java dies auch erkennt, werden die Literale in doppelten Hochkommata dargestellt:
System.out.println( "Hallo ihr da!" );
Innerhalb der Hochkommata können die Escape-Sequenzen wie bei char
-Literalen verwendet werden:
System.out.println( "Dies\nergibt\nvier\nZeilen!" );
Solche Zeichenketten stellen in Java allerdings keinen Wert eines einfachen Datentyps dar. Vielmehr ist String
eine Klasse… aber dazu später mehr unter Objekttypen.
Der Datentyp boolean
umfasst zwei Werte: wahr und falsch. Die Werte werden ausgedrückt durch die Literalkonstanten true
bzw. false
.
Genauso, wie es mathematische Ausdrücke gibt 15) gibt es auch logische Ausdrücke. Dabei liefert die Auswertung eines logischen Ausdrucks als Ergebnis einen Wert vom Typ boolean
.
Dies ist insbesondere bei der Ablaufsteuerung von Programmen von Bedeutung.
S.44