2016-05-15 22 views
26

Ich habe gerade angefangen zu lernen C und bin ziemlich verwirrt über die Deklaration von Zeichen mit int und char.Unterschied zwischen char und int bei der Deklaration von Zeichen

Ich bin mir bewusst, dass alle Zeichen aus ganzen Zahlen in dem Sinne bestehen, dass die "Integer" der Zeichen die jeweiligen ASCII-Dezimalzahlen der Zeichen sind.

Das heißt, ich habe gelernt, dass es durchaus möglich ist, ein Zeichen mit int ohne Verwendung der ASCII-Dezimalzahlen zu deklarieren. Z.B.

char test = 'X'; 

und

int test = 'X'; 

Und für beide Erklärung des Charakters, die Umwandlung Zeichen %c (obwohl Test als int definiert ist) sind: deklarieren Variable test als Zeichen 'X' kann als geschrieben werden.

Daher ist meine Frage/die Differenz sind (s) zwischen den Variablen Zeichen mit char und int deklarieren und wenn int zu verwenden, um eine Zeichenvariable zu deklarieren?

+1

Beachten Sie, dass die meisten Bibliotheksfunktionen, die ein bytegroßes Argument verwenden oder eins zurückgeben, den Typ int verwenden, zum Beispiel getchar() und toupper() und memset(). Man beachte auch, dass "X" ein "int" definiert, wie durch das Ausdrucken von "sizeof" X 'angezeigt wird. –

+0

Ähnliche Fragen: [Praktischer Unterschied zwischen int und char] (http://stackoverflow.com/questions/15869931/practical-difference-between-int-and-char) – MicroVirus

Antwort

34

Der Unterschied ist die Größe in Byte der Variablen und von dort die verschiedenen Werte, die die Variable enthalten kann.

Ein Zeichen ist erforderlich, um alle Werte zwischen 0 und 127 (enthalten) zu akzeptieren. In normalen Umgebungen belegt es genau ein Byte (8 Bit). Es ist vom Standard nicht spezifiziert, ob es signiert (-128 - 127) oder unsigniert (0 - 255) ist.

Ein int muss mindestens ein 16-Bit-Wort mit Vorzeichen sein und alle Werte zwischen -32767 und 32767 akzeptieren. Das bedeutet, dass ein int alle Werte von einem char akzeptieren kann, wobei letzterer signiert oder unsigniert ist. Wenn Sie nur Zeichen in einer Variablen speichern möchten, sollten Sie sie als char deklarieren. Mit einem int würde nur Speicher verschwenden, und könnte einen zukünftigen Leser irreführen. Eine häufige Ausnahme von dieser Regel ist, wenn Sie einen größeren Wert für spezielle Bedingungen verarbeiten möchten.Zum Beispiel wird die Funktion fgetc aus der Standardbibliothek deklariert als Rückkehr int:

int fgetc(FILE *fd); 

weil der besondere Wert EOF (End Of File) wird als int Wert definiert -1 (alle Bits auf einen in einem 2- Komplementsystem), das bedeutet mehr als die Größe eines Chars. Auf diese Weise kann kein char (nur 8 Bits in einem gemeinsamen System) gleich der EOF-Konstante sein. Wenn die Funktion deklariert wurde, eine einfache char zurückzugeben, könnte nichts den EOF-Wert vom (gültigen) Zeichen 0xFF unterscheiden.

Das ist der Grund, warum der folgende Code schlecht und sollte nicht verwendet werden:

char c; // a terrible memory saving... 
... 
while ((c = fgetc(stdin)) != EOF) { // NEVER WRITE THAT!!! 
    ... 
} 

Innerhalb der Schleife ein Zeichen wäre genug, aber für den Test nicht gelingen, wenn das Zeichen 0xFF Lesen, Die Variable muss ein int sein.

+0

Ich bin mir nicht sicher, ob das Speicherargument für eine einzelne Variable sehr sinnvoll ist. Meiner Meinung nach ist der Ausdruck von Absicht wichtiger. – svick

+0

@svick: als ein alter Dinosaurier habe ich mal ein System mit 2 ko ROM und 1 ko RAM benutzt ... In diesem Fall sollte jedes einzelne Byte gespeichert werden! Aber mit dem jetzt gebräuchlichen System ist es wahrscheinlich richtiger, Absicht auszudrücken ist wahrscheinlich wichtiger. Hoffe, es ist jetzt klarer –

+1

@SergeBallesta, man muss kein Dinosaurier sein, um mit solchen Systemen zu arbeiten ... der kleinste Chip, auf den der Compiler zielt, an dem ich arbeite, hat weniger als 1 KB ROM und weniger als 50 RAM. Embedded ist immer noch ein großer Markt für kleine Dinge. – mlp

2

Normalerweise sollten Sie Zeichen als char deklarieren und int verwenden, damit Ganzzahlen größere Werte enthalten können. Auf den meisten Systemen belegt ein Zeichen ein Byte, das 8 Bits ist. Abhängig von Ihrem System kann dieses Zeichen standardmäßig signiert oder unsigniert sein, so dass es Werte zwischen 0-255 oder -128-127 enthalten kann.

Ein Int kann 32 Bits lang sein, aber wenn Sie wirklich genau 32 Bits für Ihre Ganzzahl wollen, sollten Sie stattdessen int32_t oder uint32_t deklarieren.

1

Ich denke, es gibt keinen Unterschied, aber Sie reservieren zusätzlichen Speicher, den Sie nicht verwenden werden. Sie können auch const long a = 1;, aber es wird besser geeignet sein, stattdessen zu verwenden.

2

Größe eines int ist 4 Bytes auf den meisten Architekturen, während die Größe eines char ist 1 Byte.

+2

Beachten Sie, dass 'sizeof (char)' ist immer 1 - selbst wenn 'CHAR_BIT == 16 'oder mehr. Der Standard schreibt folgendes vor: _§6.5.3.4 Die Operatoren 'sizeof' und' _Alignof': ... ¶4 Wenn 'sizeof' auf einen Operanden vom Typ' char', 'unsigned char' oder ' signed char' angewendet wird , (oder eine qualifizierte Version davon) das Ergebnis ist 1._ –

+0

@JonathanLeffler Danke! –

+0

Die 'sizeof' ein' char' ist immer '1', aber die Größe eines' char' muss nicht ein Byte sein. – MicroVirus

5

Der Typ char hat mehrere Rollen.

Die erste ist, dass es einfach ein Teil der Kette von Integer-Typ ist, char, short, int, long usw., es ist so nur ein weiterer Behälter für Zahlen.

Der zweite ist, dass die zugrunde liegende Speicher die kleinste Einheit ist, und alle anderen Objekte haben eine Größe, die ein Vielfaches der Größe von char ist (sizeof liefert eine Zahl, die in Einheiten von char ist, so sizeof char == 1).

Die dritte ist, dass es die Rolle eines Zeichens in einer Zeichenfolge spielt, sicherlich historisch. In diesem Fall wird der Wert char einem bestimmten Zeichen zugeordnet, z. B. über die ASCII-Codierung, aber er kann auch mit Multi-Byte-Codierungen verwendet werden (eine oder mehrere char s zusammen mit einem Zeichen).

+1

Beachten Sie, dass es "signed char" ist, das in die erste Liste der signierten Typen passt. Plain 'char' kann ein vorzeichenloser Typ sein, in diesem Fall passt es nicht in diese Liste (und Maschinen, die EBCDIC verwenden, sind gezwungen, wegen der Anforderung für alle Zeichen in entweder einen vorzeichenlosen einfachen' char' oder 'CHAR_BIT> 8' zu verwenden das grundlegende Ausführungszeichen ist positiv gesetzt, und der EBCIDC-Code für "0" ist beispielsweise 240. Der Standard besagt (§6.2.5): _Es gibt five_ standard signed integer Typen, _bezeichnet als 'signed char',' short int', 'int',' long int' und 'long long int'._ –

Verwandte Themen