Forum: PC-Programmierung Ascii: Wann wird mir Variable als Zahl und wann als Zeichen dargestellt?


von xxox (Gast)


Lesenswert?

Hallo,

ich verstehe nicht wirklich wann mir das Zeichen '0' als 0 angezeigt 
wird und wann als 48 (nach ASCII)?
Ich habe leider gerade keinen IDE mit der ich es testen kann.

Daher folgendes Beispielprogramm:
Wird die Null bei einem Integer immer als Zahl 0 ausgegeben und bei 
einem Char als Zeichen 0 ?
Wenn ja, wieso ist das so?

1
main()
2
{
3
    char zeichen;
4
5
    printf("\nBitte ein Zeichen eingeben: ");
6
    scanf("%c", &zeichen);
7
8
    int ascii = zeichen;
9
10
    printf("\n%c hat den dez. ASCII-Code %d", zeichen, ascii);
11
}

von xxox (Gast)


Lesenswert?

xxox schrieb:
> Zahl 0

als Zahl 48 meinte ich natürlich

von Peter II (Gast)


Lesenswert?

xxox schrieb:
> ich verstehe nicht wirklich wann mir das Zeichen '0' als 0 angezeigt
> wird und wann als 48 (nach ASCII)?

als 48 kann ich NIE dargestellt werden, weil das zwei Zeichen sind.

von ./. (Gast)


Lesenswert?

> Ich habe leider gerade keinen IDE mit der ich es testen kann.

Heisst das Fach "Experimentelles Programmieren"?

Wie waers mal mit einem Buch?

Tipp: Das Telefonbuch ist nicht gemeint.

von xxox (Gast)


Lesenswert?

Peter II schrieb:
> als 48 kann ich NIE dargestellt werden, weil das zwei Zeichen sind.

Wieso entspricht nach Ascii die 48 dann dem Zeichen Null? Diese 
Kodierung muss doch irgendwo Anwendung finden?

von Jonas B. (jibi)


Lesenswert?

char kann (meistens) den Wertebereich von 0-255 annehmen.
Dieser Vorrat reicht gut aus um jeden Buchstaben und noch ein paar 
zusätzliche Zeichen im Alphabet eine entsprechenden Vertretter 
zuzuweisen.
So ist dem großen 'A' zum Beispiel der Dezimalwert 65 zugeorndet, dem 
kleinen 'c' der Dezimalwert 99.

http://www.torsten-horn.de/techdocs/ascii.htm

Wann welche Interpretation angewand wird entscheidet, der Datentyp und 
bestimmt Zeichen in der Syntax.

char a = 5; //Zuweisung der Zahl 5
char a = '5'; //Zuweisung der Zahl 53 (siehe tabelle)

Gruß J

von Marc E. (mahwe)


Lesenswert?


von restfet (Gast)


Lesenswert?

xxox schrieb:
> Peter II schrieb:
> als 48 kann ich NIE dargestellt werden, weil das zwei Zeichen sind.
>
> Wieso entspricht nach Ascii die 48 dann dem Zeichen Null? Diese
> Kodierung muss doch irgendwo Anwendung finden?

Weil es so festgelegt wurde. Und ASCII ist weitverbreitet..

Ob in der Konsole das Zeichen '0' oder die Zahl 48 angezeigt wird, hängt 
vom Platzhalter im printf-String ab. Bei %c wird 0 angezeigt, bei %d 
(und anderen) die Zahl 48.

von xxox (Gast)


Lesenswert?

Jonas B. schrieb:
> char a = 5; //Zuweisung der Zahl 5
> char a = '5'; //Zuweisung der Zahl 53 (siehe tabelle)

Danke das hier habe ich gesucht.

Aber noch eine Frage, wie kann ich ein Zeichen ausgeben?

char zeichen = 'A';
printf("\n%c, zeichen);

Wird mir jetzt ein A oder die zugehörige Zahl ausgegeben?
Hat mir bitte jemand ein Beispiel, bei dem A als Zeichen und bei dem A 
als Zahl (nach ASCII) ausgegeben wird?

von xxox (Gast)


Lesenswert?

restfet schrieb:
> Bei %c wird 0 angezeigt, bei %d
> (und anderen) die Zahl 48.

ok, das ist schon die antwort auf meine gerade gestellte Frage.

Aber ich verstehe noch nicht wirklich warum es bei einem Char als 
Zeichen dargestellt wird und bei einem Integer als 48?

Der einzige Unterschied zwischen diesen Datentypen ist doch der 
Wertebereich, der bei Integer größer ist. Liegt es daran, dass ich mit 
meinem einen Byte vom Integer nur ein Zeichen darstellen kann, also die 
0 und mit Integer kann ich zwei darstellen, also die 48?

von Peter II (Gast)


Lesenswert?

xxox schrieb:
> Aber ich verstehe noch nicht wirklich warum es bei einem Char als
> Zeichen dargestellt wird und bei einem Integer als 48?

ein char ist auch nur ein integer mit 8 bit.

von restfet (Gast)


Lesenswert?

xxox schrieb:
> restfet schrieb:
> Bei %c wird 0 angezeigt, bei %d
> (und anderen) die Zahl 48.
>
> ok, das ist schon die antwort auf meine gerade gestellte Frage.
>
> Aber ich verstehe noch nicht wirklich warum es bei einem Char als
> Zeichen dargestellt wird und bei einem Integer als 48?
>
> Der einzige Unterschied zwischen diesen Datentypen ist doch der
> Wertebereich, der bei Integer größer ist. Liegt es daran, dass ich mit
> meinem einen Byte vom Integer nur ein Zeichen darstellen kann, also die
> 0 und mit Integer kann ich zwei darstellen, also die 48?

Nein, mit dem %c oder %d wird nur die Darstellung durch die Funktion 
printf festgelegt.

Such mal printf bei Google, vielleicht werden dir dann das mit den 
Formatierungsoptionen klarer.

von guest (Gast)


Lesenswert?

xxox schrieb:
> Aber ich verstehe noch nicht wirklich warum es bei einem Char als
> Zeichen dargestellt wird und bei einem Integer als 48?

Dem ist auch nicht so.

Die Darstellung liegt nur an %c bzw %d im Format-String der 
printf-Funktion:

%c - Darstellung als Char
%d - Dezimale Darstellung
%x - hexadezimale Darstellung
...

von physiker (Gast)


Lesenswert?

xxox schrieb:
> Aber ich verstehe noch nicht wirklich warum es bei einem Char als
> Zeichen dargestellt wird und bei einem Integer als 48?

Woher soll der Compiler sonst wissen, als was Du die Bitfolge an der 
Stelle interpretiert haben möchtest? Es gibt halt eine 
Standardinterpretation per Datentyp und wenn Du es anders haben 
möchtest, musst Du es halt angeben.

von Paul B. (paul_baumann)


Lesenswert?

Peter II schrieb:
> als 48 kann ich NIE dargestellt werden, weil das zwei Zeichen sind.

Du nicht, da hast Du Recht.

MfG Paul

von Joachim B. (jar)


Lesenswert?

xxox schrieb:
> Wieso entspricht nach Ascii die 48 dann dem Zeichen Null? Diese
> Kodierung muss doch irgendwo Anwendung finden?

rate mal was ASCII heisst?

google wird dir verraten

von Joachim B. (jar)


Lesenswert?

xxox schrieb:
> Der einzige Unterschied zwischen diesen Datentypen ist doch der
> Wertebereich, der bei Integer größer ist.

ist er denn das?

wieso gibt es wohl die Datentypen

int8_t
int16_t
int32_t
int64_t

sowie die uint Typen?

int selbst sagt doch nichts über die Größe aus!

von icke (Gast)


Lesenswert?

xxox schrieb:
> Ich habe leider gerade keinen IDE mit der ich es testen kann.

https://ideone.com/

von xxox (Gast)


Lesenswert?

Joachim B. schrieb:
> int selbst sagt doch nichts über die Größe aus!

Was sagt int dann aus? Bzw. was ist dann der Unterschied zwischen int 
und char?

Habe es so gelernt, dass char 1 Byte hat und int 2 oder 4 Byte hat.

von Joachim B. (jar)


Lesenswert?

xxox schrieb:
> Habe es so gelernt, dass char 1 Byte hat und int 2 oder 4 Byte hat.

das ist aber überholt seit es QWORDS 64-bit = 8 Bytes gibt.

Mit einem Byte kann man auch nicht alle Zeichensätze bedienen, lese dich 
mal in UTF ein

https://de.wikipedia.org/wiki/Unicode_Transformation_Format

: Bearbeitet durch User
von Murmelchen (Gast)


Lesenswert?

Marc E. schrieb:
> 
http://openbook.rheinwerk-verlag.de/c_von_a_bis_z/007_c_typumwandlung_001.htm#mjed1ca17e7a896801712e6998db8be66b

Gerade die Werke von Herrn Jürgen Wolf werden zumindest von denjenigen, 
die sich etwas besser mit der Thematik auskennen, als nicht so 
empfehlenswert angesehen, da sie oft viel zu viele Fehler enthalten. Und 
mit Fehler sind dabei nicht etwa Flüchtigkeitsfehler und dergleichen 
gemeint, sondern es werden zu oft Aussagen getroffen, die schlicht nicht 
zutreffen und die vermuten lassen, dass es dem Autor an einem tiefer 
gehenden Verständnis und Kenntnissen mangelt.


Mit besten Grüßen

Murmelchen

von Murmelchen (Gast)


Lesenswert?

Hallo,

vielleicht helfen Dir ja die folgenden Beispiele, den Sachverhalt besser 
zu verstehen.

1
#include <stdio.h>
2
3
int main(void)
4
{
5
    char ch;
6
    int i;
7
    
8
    
9
    ch = 65;        
10
    ch = ch + 1; 
11
    ch++;
12
    printf("ch = %c, entspricht dem ASCII-Wert %d\n\n", ch, ch);
13
    
14
    i = 'a';       
15
    printf("i = %d, entspricht dem ASCII-Zeichen %c\n", i, i);
16
    
17
    ch = i + 3;
18
    printf("ch = %c, entspricht dem ASCII-Wert %d\n", ch, ch);
19
    if ('a' <= ch && ch <= 'z')
20
        ch = ch - 'a' + 'A';
21
    printf("ch = %c, entspricht dem ASCII-Wert %d\n\n", ch, ch);
22
    
23
    for (ch = 'A'; ch <= 'Z'; ch++)
24
        printf("%c ", ch);
25
    printf("\n");
26
    
27
    return 0;
28
}

Will man allerdings wirklich portable Programme schreiben, sollte man 
auf Zuweisungen der den ASCII-Werten entsprechenden numerischen Werte 
verzichten und und ausschließlich die gewünschten Zeichen (in einfachen 
Anführungszeichen) verwenden. Erhöht zudem die Lesbarkeit des 
Quelltextes.

Also nicht char ch = 65, sondern char ch = 'A'

Und char ch = 5 ergibt auch nicht das Zeichen '5', sondern im ASCII-Code 
das nicht druckbare Steuerzeichen ENQ, welches für Enquiry bzw. Anfrage 
(bei einer Fernscheibverbindung) steht. Die Antwort darauf lautet 
übrigens ACK (ASCII-Code 6).


Mit besten Grüßen

Murmelchen

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.