Robert B.: Typkonvertierung in C bzw. Perl

Beitrag lesen

Moin Troll19,

In einem Buch im Internet habe ich die automatische Typkonvertierung in C gefunden. Demnach sollte man folgendes schreiben:

char v1 = 'a';

int v2 = v1;

Achtung: int und char haben unterschiedliche Wertebereiche! Ein char ist 8 Bit/1 Byte groß, ein int üblicherweise 32 Bit/4 Byte. Mit der Zuweisung int v2 = v1; hast du also einen Wert erzeugt, der erst einmal mit drei Bytes der Wertigkeit 0 beginnt; wenn char ASCII-kompatibel ist, ist

char v1 = 'a';     /* 0x61 */

int v2 = v1; /* 0x00000061 */

Das heißt umgekehrt auch, dass die Rückkonvertierung char v1 = v2; potenziell verlustbehaftet ist, wenn v2 > 0xff.

Bis 0x7f funktioniert das auch so weit. Man bekommt zwar nicht den Hex-Code, aber immerhin den Integerwert.

Du kannst jeden Integerwert auch hexadezimal darstellen lassen.

Über 0x7f hört der Spaß dann auf, weil das höchstwertige Bit als Vorzeichen interpretiert wird.

Das ist eine Besonderheit von C, da ein char auch ein 8-bittiger Integer wert ist. Wenn du unsigned char verwendest (oder dem Compiler sagst, dass er char als unsigned char kompilieren soll), ist das höchstwertige Bit kein Vorzeichen. Aber im Zeichenkontext spielt das Vorzeichen meiner Erfahrung eh keine Rolle, das heißt, dass z.B. bei Verwendung von ISO-8859-1 folgendes möglich ist:

signed char umlaut = 'ä';  /* 0xe4 in ISO-8859-1 */

Über 0x7f fängt der Spaß erst richtig an, weil man Zeichenkodierungen berücksichtigen muss 😉

Viele Grüße
Robert