10 Stimmen

Bedeutung negativer Werte des Typs char in C

  1. Zeichen in 'C' werden verwendet, um Zeichen darzustellen.
  2. Zahlen, die Zeichen in allen Code-Seiten darstellen, sind immer positiv.

Was ist der Nutzen von vorzeichenbehafteten Zeichen?? Werden negative Werte in Zeichen nur als ganze Werte in einem kleineren integralen Datentyp als int und short verwendet?? Haben sie keine andere Interpretation??(wie positive Werte in Zeichen, die Zeichen darstellen)

12voto

Martin Beckett Punkte 92477

Chars in 'C' werden verwendet, um Zeichen darzustellen.

Nicht immer werden Chars verwendet, um Bytes darzustellen, sie sind der einzige Typ in C mit einer bekannten Größe.

5voto

Christoph Punkte 157217

Nur Zeichen des grundlegenden Zeichensatzes sind garantiert nichtnegativ (C99, 6.5.2 §3):

Ein Objekt, das als Typ char deklariert ist, ist groß genug, um jedes Element des grundlegenden Zeichensatzes auszuspeichern. Wenn ein Element des grundlegenden Zeichensatzes in einem char-Objekt gespeichert wird, ist sein Wert garantiert nichtnegativ. Wenn ein anderes Zeichen in einem char-Objekt gespeichert wird, ist der resultierende Wert implementationsabhängig, aber er muss innerhalb des Wertebereichs liegen, der in diesem Typ dargestellt werden kann.

Sie müssen zwischen dem 'einfachen' char-Typ und den Typen signed char und unsigned char unterscheiden: signed char und unsigned char sind gewöhnliche Ganzzahltypen, für die folgendes gilt (C99, 6.5.2 §5):

Ein als Typ signed char deklariertes Objekt belegt den gleichen Speicherplatz wie ein „einfaches“ char-Objekt.

4voto

DevSolar Punkte 63096

Zahlen, die Zeichen in allen Zeichensätzen darstellen, sind immer positiv.

Ähm... falsch!?

Aus dem C99-Standard, Betonung von mir:

Wenn ein Element des grundlegenden Ausführungszeichensatzes in einem char-Objekt gespeichert ist, ist sein Wert garantiert positiv.

Es ist nicht garantiert, dass alle gültigen Zeichen aller Zeichensätze positiv sind. Ob char signiert oder unsigned ist, ist implementierungsabhängig!

2voto

jakeboxer Punkte 3200

Von Jack Klein's Home Page:

Signed char kann alle Werte im Bereich von SCHAR_MIN bis SCHAR_MAX halten, wie in limits.h definiert. SCHAR_MIN muss -127 oder weniger (negativer) sein, und SCHAR_MAX muss 127 oder größer sein. Beachten Sie, dass viele Compiler für Prozessoren, die eine 2-Komplementdarstellung verwenden, SCHAR_MIN von -128 unterstützen, aber dies ist nicht von den Standards vorgeschrieben.

Soweit ich sehen kann, gibt es keine offizielle "Bedeutung" von signed char. Etwas, worauf man achten sollte, ist jedoch, dass alle normalen ASCII-Zeichen im Bereich von 0 bis 127 liegen. Daher kann der Typ signed char verwendet werden, um legale Werte auf den Bereich von 0 bis 127 zu beschränken und alles unter 0 als Fehler zu definieren.

Zum Beispiel, wenn ich eine Funktion hätte, die nach einigen ASCII-Texten sucht und das am häufigsten vorkommende Zeichen zurückgibt, könnte ich vielleicht einen negativen Rückgabewert definieren, um zu bedeuten, dass zwei oder mehr Zeichen gleich häufig vorkommen. Dies ist nicht unbedingt eine gute Art und Weise, Dinge zu tun, es ist nur ein Beispiel, das mir spontan einfällt.

2voto

pmg Punkte 102904

Nur Vorsicht beim Verwenden von normalen Zeichen als Array-Indizes.

char buf[10000];
fgets(buf, sizeof buf, stdin);
unsigned charcount[UCHAR_MAX] = {0};
char *p = buf;
while (*p) {
    charcount[*p]++; /* if (*p < 0) BOOM! */
    // charcount[(unsigned char)*p]++;
    p++;
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X