Ascii: Wann wird mir Variable als Zahl und wann als Zeichen dargestellt?

Gast #4725831
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
}
#4725843
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
Gast #4725849
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.
Gast #4725859
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?
Gast #4725863
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?
Gast #4725880
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.
Gast #4725881
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
...
Gast #4725891
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.
Gast #4726805
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
Gast #4726814
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren