Markus schrieb:
> hast du vielleicht ein link parat?
Da gehts weniger um einen Link, bzw. ums lösen sondern um das
Verständnis.
Alles in einem Computer sind Zahlen!
Was diese Zahlen darstellen, das entscheidet derjenige, dem man die Zahl
vorwirft.
Hat man ein Byte, dann kann dieses Byte Zahlen von 0 bis 255 aufnehmen.
Zuzm Beispiel kann ein Byte den Wert 65 haben.
Diese 65 können jetzt zb für 65 Schnitzel stehen.
Schickt man dieses Byte, mit dem Wert 65 aber an ein Terminal, dann
passiert etwas ganz anderes. Das Terminal interpretiert diese 65 als den
Code eines Zeichens. Kriegt es ein Byte mit dem Wert 65, dann malt es in
einem Kasten genau jene Pixel an, so dass dein Gehirn dort ein 'A'
liest.
D.h. aber auch, dass man eine Zahl in einem Byte nicht einfach ausgeben
kann, weil ein Terminal diese Zahl ja als den Code eines bestimmten
Zeichens auffassen würde.
Will man das erreichen, dann muss man die 65 zerlegen, in die 6 und die
5 und die dafür zuständigen Codes für die zugehörigen Zeichen zum
Terminal übertragen. In dem Fall wäre das die 54 (der ASCII Code für das
zeichen '6') und die 53 (der ASCII COde für das Zeichen '5'). Das
Terminal empfängt ein Byte mit dem Wert 54 und malt daraufhin in das
Rechteck diejenigen Pixel schwarz an, so dass sich für dein Gehirn das
Zeichen '6' formiert. Mit dem nachfolgenden Byte kriegst das Terminal
den Wert 53, den es wieder so umsetzt, dass es in das nächste Rechteck
die Pixel für '5' schwarzt anmalt. In Summe liest dein Gehirn damit dort
die 65. Aber die 65 wurden zu keinem Zeitpunkt zum Terminal geschickt.
Was geschickt wurde ist der Code für das Zeichen '6' und der Code für
das Zeichen '5'.
Jetzt hab ich aber eingangs gesagt: Alles in einem Computer ist eine
Zahl. Auch ein
führt letzten Endes dazu, dass für c ein Byte im Speicher reserviert
wird und in diesem Byte wird die Zahl 65 abgelegt (der ASCII Code für
'A').
Auf der anderen Seite hast du schon gesehen, dass es einen fundamentalen
Unterschied gibt, je nachdem wie ich die 65 zur Ausgabe schicke. In dem
einen Fall erscheint auf der Ausgabe ein 'A', im anderen Fall erscheinen
auf der Ausgabe die Zeichen '6' und '5'.
Wie wird das entschieden?
Der springende Punkt liegt im Datentyp. Der Compiler weiß implizit, dass
er bei einem Datentyp von char eine Ausgabefunktion benutzen muss
(println) die einen char Datentyp akzeptiert. Und diese Ausgabefunktion
übergibt das in c gespeicherte Byte einfach so an das Ausgabegerät.
Daher kann ich schreiben
1 | char c = 'A';
|
2 | println( c );
|
3 |
|
4 | bzw.
|
5 |
|
6 | char c = 65;
|
7 | println( c );
|
und erhalte in beiden Fällen ein 'A' auf dem Bildschirm. Denn die vom
Compiler ausgewählte Funktion println, die einen char akzeptiert, die
macht genau das: sie sendet das Byte, welches sie zu übertragen hat, so
wie es ist zur Ausgabe. Und in beiden Codefällen steht in c der Wert 65
drinnen. Im ersten Fall habe ich den Wert 65 angegeben, indem ich 'A'
geschrieben habe und mich darauf verlassen habe, dass der Compiler da
schon den entsprechenden ASCII Code dafür einsetzen wird. Im zweiten
Fall hab ich die 65 direkt hingeschrieben. Im Endergebnis macht das
keinen Unterschied. Im Byte c steht das Bitmuster für die Zahl 65. Wird
dieses Byte so wie es ist an ein Ausgabegerät geschickt, dann malt
dieses Ausgabegerät die Pixel für ein 'A' schwarz an.
Hingegen macht ein
1 | int c = 65;
|
2 |
|
3 | println( c );
|
etwas völlig anderes. Jetzt ist c vom Datentyp int. Und in dem Fall
kommt eine andere Funktion println zum Zug. Nämlich eine, die einen int
übernimmt. Und die funktioniert anders. Anstatt den wert (die 65) so wie
er ist, zum Ausgabegerät zu senden, zerlegt sie den Wert in die
Einzelteile und sendet die Zeichen für '6' bzw. '5' zum Ausgabegerät.
Dadurch steht dann am Ausgabegerät nicht ein 'A' sondern '6' und '5' und
dein Gehirn macht da dann wieder die 65 draus.
Der entscheidende Unterschied ist der Datentyp bzw. das du den Datentyp
so gewählt hast, dass genau das passiert, was du haben willst.
Preisfrage:
was werde ich am Ausgabegerät sehen, wenn ich schreibe
1 | char c = 65;
|
2 |
|
3 | println( (int)c );
|
bzw. was sehe ich, wenn ich schreibe
1 | int c = 65;
|
2 |
|
3 | println( (char)c );
|