Forum: PC-Programmierung Frage zu Type Conversion. Char to Int. Aus KR Buch


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Alexander (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hi
ich versuche mir gerade anhand des Kernighan & Ritchie Buches die 
Programmiersprache C selbst beizubringen. Dabei bin ich über einen 
Abschnitt gestolpert, dessen Inhalt mich ein wenig verwirrt.

Kapitel 2.7 - Type Conversions, Seite 43/44:
"The language does not specify whether variables of type char are signed 
or unsigned quantities..."
Soweit, so gut. Bei
1
char test1;
weiß man nicht, ob char vorzeichenbehaftet ist oder nicht. Es gibt 
erstmal nur char. Wenn char nun in einen int umgewandelt wird, ist nicht 
klar, ob der Inhalt signed oder unsigned sein soll. Soweit korrekt?

"...But arbitrary bit patterns stored in character variables may appear 
to be negative on some machines, yet positive on others."
Okay, ein char ist 1 byte, also 8 bit, und kann laut ASCII Tabelle eine 
Dezimalzahl zwischen 0 und 254 beinhalten. Die binäre Form dessen würde 
ich als "arbitrary bit pattern" verstehen. Beispiel:
1
char test1 = 'A';
Char 'A' ist laut ASCII Tabelle die Dezimalzahl 65, dessen binär int (16 
bit) Äquivalenz entsprechend 0000 0000 0100 0001 wäre.
Das ist das "arbitrary bit pattern", von denen die sprechen. Wie die 
jeweilige Maschine dieses "arbitrary bit pattern" nun interpretiert 
(signed oder unsigned), hängt von der Maschine ab. Korrekt?

"For portability, specify signed or unsigned if non-character data is to 
be stored in char variables".
Hier kommt jetzt der Knackpunkt. Oben wurde geschrieben, dass ein char 
weder signed noch unsigned ist. Ein char ist lediglich
1
char test1 = 'A'
und 'A' kann je nach verwendeter Maschine anders 
interpretiert/umgewandelt werden.

Wie kann ich nun spezifizieren, wie eine Zahl in einer char Variable 
gespeichert werden soll?

Wahrscheinlich ist es sehr trivial, und dennoch bin ich zu blöd dazu und 
drehe mich eher im Kreis als dass ich gerade aus gehe. :D

Danke und Gruß

von M. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
unsigned char a = 100;
signed char b = -100;

von Frank M. (ukw) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Alexander schrieb:
> char test1 = 'A'
> und 'A' kann je nach verwendeter Maschine anders
> interpretiert/umgewandelt werden.

Auf den meisten Maschinen ist 'A' einfach nur der Zahlenwert 65 oder in 
Hex 0x41.

Google: man ascii

Daher ist
1
char test1 = 'A';
hier dasselbe wie
1
char test1 = 0x41;
oder auch
1
char test1 = 65;

Ok, es gibt da noch Maschinen, die nicht ASCII, sondern andere 
"Alphabete" benutz(t)en, wie z.B. EBCDIC. Hier hat 'A' tatsächlich einen 
anderen numerischen Wert.

Daher ist die Schreibweise
1
char test1 = 'A';

in diesem Zusammenhang portabler.

Da der Wert von 'A' auf Maschinen, die ASCII "sprechen", jedoch kleiner 
als 128 ist, ist es vollkommen egal, ob eine char-Variable signed oder 
unsigned  ist. Hier wird 'A' immer gleich behandelt. Bei Umlauten, 
welche z.B. beim ISO8559-Zeichensatz (welcher ASCII umfasst) einen 
numerischen Wert > 128 haben, sieht die Welt schon wieder anders aus. 
Hier sollte man besser "unsigned char" verwenden. Warum? Es gibt in 
einigen Implementationen von C-Libs solche Makros wie tolower(), welche 
über ein Array arbeiten. Ein negativer Index macht sich hier nicht so 
gut. (Okay, sowas könnte man casten bzw. wurde später dann in den Macros 
gecastet).

: Bearbeitet durch Moderator
von ui (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Alexander schrieb:
> Wie kann ich nun spezifizieren, wie eine Zahl in einer char Variable
> gespeichert werden soll?

Ist doch irrelevant. Warum sollte man für eine Zahl ein char benutzen, 
wenn der Datentypen char von character und eben nicht von "number" 
kommt. Willst du eine Zahl speichern, nimmt int, uint. Willst du einen 
character speichern, beschränk dich auf ascii und char, dem Problem 
gehst du ausm Weg, da ascii nur 127 Zeichen hat.

von Rolf M. (rmagnus)


Bewertung
0 lesenswert
nicht lesenswert
Alexander schrieb:
> Bei
> char test1;
> weiß man nicht, ob char vorzeichenbehaftet ist oder nicht. Es gibt
> erstmal nur char. Wenn char nun in einen int umgewandelt wird, ist nicht
> klar, ob der Inhalt signed oder unsigned sein soll. Soweit korrekt?

Ja, das ist korrekt.

> Okay, ein char ist 1 byte,

Ja.

> also 8 bit,

In C ist ein Byte nicht zwingend exakt 8 Bit, sondern nur mindestens 
8 Bit breit.

> und kann laut ASCII Tabelle eine Dezimalzahl zwischen 0 und 254
> beinhalten.

C setzt kein ASCII voraus. Abgesehen davon hat die ASCII-Tabelle nur 7 
Bit.

> Wie die jeweilige Maschine dieses "arbitrary bit pattern" nun
> interpretiert (signed oder unsigned), hängt von der Maschine ab. Korrekt?

Wenn man es als Integer nutzt, ja.

> "For portability, specify signed or unsigned if non-character data is to
> be stored in char variables".
> Hier kommt jetzt der Knackpunkt. Oben wurde geschrieben, dass ein char
> weder signed noch unsigned ist.

Ein char ist entwder signed oder unsigned. Da sich der Compiler das aber 
raussuchen kann, ist es am besten, Code so zu schreiben, dass seine 
Funktion nicht von Annahmen darüber abhängt.

> Ein char ist lediglich
> char test1 = 'A'
> und 'A' kann je nach verwendeter Maschine anders
> interpretiert/umgewandelt werden.
>
> Wie kann ich nun spezifizieren, wie eine Zahl in einer char Variable
> gespeichert werden soll?

Gar nicht. Am besten ist es, keine Zahlen darin zu speichern. Oben 
steht's doch explizit: Wenn du Zahlen speicherst, nimmt nicht char, 
sondern signed char oder unsigned char.
Für Text kann es dir egal sein, ob der darunterliegende Integer-Typ ein 
Vorzeichen hat, da du darin Text nur speicherst, aber nicht damit 
rechnest. Erst beim Rechnen wird das relevant.

: Bearbeitet durch User
von Alexander (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Okay, danke euch. Ich glaube, dass es jetzt etwas klarer geworden ist :)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.