2010-02-12 9 views
42

Ich versuchteIn C, warum ist sizeof (char) 1, wenn 'a' ein int ist?

printf("%d, %d\n", sizeof(char), sizeof('c'));

und bekam 1, 4 als Ausgabe. Wenn die Größe eines Charakters eins ist, warum gibt 'c' mir 4? Ich schätze, es ist, weil es eine ganze Zahl ist. Also, wenn ich char ch = 'c'; mache, gibt es eine implizite Umwandlung, unter der Haube, von diesem 4-Byte-Wert zu einem 1-Byte-Wert passiert, wenn es der Char-Variable zugeordnet ist?

+3

Ich glaube, es ist mit automatischer Integer-Förderung zu tun, jemand mit mehr Fakten als Glaube wird ein sachlichen Antwort –

+2

@Roger schreiben: Er bittet um den Unterschied zwischen C und C++ sizeof (‚a‘), während ich gefragt wenn es eine Konvertierung gibt? Siehe den Fragenkörper. Ich habe bereits gefolgert, dass "a" eine ganze Zahl in C ist. – legends2k

+0

Ich muss "David Rodríguez - dribeas" dafür danken, dass er darauf hingewiesen hat, dass der Link in meiner Antwort falsch ist. Ich lösche meine Antwort. Legends2k, die richtige Antwort sollte nach meiner bescheidenen Meinung zu Peter oder Neil gehen. –

Antwort

35

In C 'a' ist eine Ganzzahlkonstante (!?!), Also ist 4 für Ihre Architektur richtig. Es wird implizit in char für die Zuweisung konvertiert. sizeof (char) ist per Definition immer 1. Der Standard sagt nicht, welche Einheiten 1 ist, aber es ist oft Bytes.

+13

+ 1 für "aber es ist oft Bytes", ich kichle immer noch :) –

+0

verwendet, um eine ganze Zahl war 2 Bytes .. der Standard definiert das auch nicht. – lexu

+0

Darf ich den Grund für den Standard wissen, dass 'sizeof (char)' immer 1 sein sollte? Liegt es an der ASCII-Tabelle mit 256 Zeichen? Was, wenn ich in einer Implementierung mehr als das haben muss, sagen wir Unicode? – legends2k

0

die ANSI-C-Normen Nach einem char zu einem int im Rahmen gefördert wird, wo ganze Zahlen verwendet werden, verwendete man eine ganze Zahl Formatbezeichner in den printf daher die verschiedenen Werten. Ein Zeichen ist normalerweise 1 Byte, aber das ist eine Implementierung, die auf der Laufzeit und dem Compiler basiert ist.

+5

Das Integer Format bezieht sich auf sizeof ('a') nicht 'a' also ich don ' t sehen, wie dieses Argument gilt. –

+1

Der C-Standard besagt, dass ein char-Literal vom Typ int ist - es hat sizeof int und es gibt keine Werbung. –

+1

Ihre Antwort scheint darauf hinzudeuten, dass der C-Compiler eine Formatzeichenfolge überprüft, die von einer Bibliotheksfunktion beim Kompilieren eines Programms verwendet wird. Sind Sie sicher, dass dies der Fall ist? –

7

Der C-Standard besagt, dass ein Zeichenliteral wie 'a' vom Typ int ist, nicht vom Typ char. Es hat daher (auf Ihrer Plattform) sizeof == 4. Siehe this question für eine ausführlichere Diskussion.

+0

Ich fragte nach der Promotion/Casting, die zwischen den beiden Datentypen passiert, während die Diskussion/Antwort dies nicht beantwortet. – legends2k

+1

@ Legends2K Sie fragte: "Wenn die Größe eines Charakters eins ist, warum gibt 'c' mir 4?" Da diese Antwort und die Frage, die ich verlinkt habe, erklären, dass 'a' sizeof == 4 hat, findet offensichtlich kein Casting oder eine Promotion statt. –

+0

Gut. Es gibt eine detaillierte Form der Frage darunter, die lautet: "Gibt es eine implizite Typumwandlung, die von diesem 4-Byte-Wert unter der Haube zu einem 1-Byte-Wert passiert, wenn es der char-Variable zugewiesen ist". Das ist auch ein Teil davon, glaube ich. – legends2k

5

Es ist das normale Verhalten des sizeof Operator (siehe Wikipedia):

  • Für einen Datentyp, sizeof gibt die Größe des Datentyps. Für char erhalten Sie 1.
  • Für einen Ausdruck gibt sizeof die Größe des Typs der Variablen oder des Ausdrucks zurück. Als Zeichenliteral als int eingegeben wird, erhalten Sie 4.
4

Dieses in ISO C11 abgedeckt ist 6.4.4.4 Character constants obwohl es von früheren Standards weitgehend unverändert ist. Das heißt, in Absatz /10:

Eine Ganzzahl-Zeichenkonstante hat den Typ int. Der Wert einer ganzzahligen Zeichenkonstante , die ein einzelnes Zeichen enthält, das einem Ein-Byte-Ausführungszeichen zugeordnet ist, ist der numerische Wert der Darstellung des abgebildeten Zeichens, der als Ganzzahl interpretiert wird.

+0

+1 danke für den Standard zitieren; Ich frage mich, warum _integer character constant_ über _character constant_ gewählt wurde. – legends2k