Datentypen

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

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 );

Gleitkommazahlen

Motivation

  1. Was gibt folgende Anweisung aus?
       System.out.println(1/10);


    Lösung: 9)
    Ursache: 10)

  2. Wie muss man obige Anweisung ändern, damit das richtige Ergebnis ausgegeben wird? 11)

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:

  • Vorzeichen, Dezimalpunkt,
  • Ziffernfolgen vor und nach dem Dezimalpunkt,
  • Exponent, bestehend aus E bzw. e und einer evtl. vorzeichenbehafteten Ziffernfolge,
  • Endung (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:

  • Falls ein Dezimalpunkt auftritt, muss vor oder nach diesem eine Ziffernfolge stehen.
  • Ohne Endung ist ein Gleitkommaliteral vom Typ double.

Eine korrekte Ausgabe für unser Beispiel von oben erhalten wir demnach mit:

   System.out.println(1.0/10.0);

Der Datentyp ''char'' für Zeichen

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:

  • In Hochkommata gestellt: 'A' , '?'
  • Unicode-Schreibweise: \u gefolgt von vier hexadezimalen Ziffern. So kann 'A' als '\u0041' 13) geschrieben werden.
  • Escape-Sequenzen zur vereinfachten Darstellung von "unsichtbaren" Zeichen oder Zeichen mit Sonderbedeutung:
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.

  1. Probiere weitere Buchstaben aus (z.B. die deiner Namen)!
  2. Worin unterscheiden sich die entsprechenden Zahlen von Groß- und Kleinbuchstaben? 14)
  3. Welcher Zahl entspricht das Zeichen für die Ziffern 0 bis 9?

Zeichenketten

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'' für Wahrheitswerte

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

1) auch: einfache Datentypen
2) also: Natürlichen Zahlen
3) muss man erst einmal nicht verstehen ;-)
4) das an der 27=128er Stelle
5) Ein Bit ist die kleinste Speichereinheit im PC → 2 Zustände: 0 oder 1
6) Das Fachwort für "3", "4", usw. lautet Literalkonstanten
7) Numeric overflow
8) beim Kompilieren (Übersetzen)
9) Es wird 0 ausgegeben.
10) Da 1 und 10 Ganzzahlliterale sind, wird die Division als Ganzzahldivision interpretiert.
12) floating point numbers
13) (65)10 = (41)16
14) Für die Tüftler: Hexadezimalcode anschauen ;-)
15) z.B. 3+4
start/info/11if/03_datentypen.txt · Zuletzt geändert: 23.10.2013 10:12 (Externe Bearbeitung)
www.chimeric.de Creative Commons License Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0