Warum ist in C sizeof(char) 1, wenn ‘a’ ein int ist?
Lesezeit: 7 Minuten
Legenden2k
Ich habe es versucht
printf("%d, %d\n", sizeof(char), sizeof('c'));
und bekam 1, 4 als Ausgang. Wenn die Größe eines Zeichens eins ist, warum dann? 'c' Gib mir 4? Ich denke, es liegt daran, dass es eine ganze Zahl ist. Also, wenn ich es tue char ch="c"; Findet unter der Haube eine implizite Konvertierung von diesem 4-Byte-Wert in einen 1-Byte-Wert statt, wenn er der char-Variablen zugewiesen wird?
Ich glaube, es hat mit der automatischen Integer-Promotion zu tun, jemand mit mehr Fakten als Glauben wird eine sachliche Antwort posten
– Binäre Sorge
12. Februar 2010 um 13:32 Uhr
@Roger: Er fragt nach dem Unterschied zwischen C und C++ sizeof(‘a’), während ich gefragt habe, ob eine Konvertierung stattfindet? Siehe Fragetext. Ich habe bereits abgeleitet, dass ‘a’ eine Ganzzahl in C ist.
– legends2k
12. Februar 2010 um 14:01 Uhr
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 meiner bescheidenen Meinung nach an Peter oder Neil gehen.
– Binäre Sorge
12. Februar 2010 um 15:30 Uhr
Sie haben Ihre Antwort erhalten, aber einen Kommentar: Sie können nicht drucken size_t Objekte mit "%d". Seit sizeof Erträge size_t a size_t Objekt, sollten Sie es mit drucken "%zu" (C99) oder werfen Sie es zu unsigned long und mit drucken "%lu" (C89).
– Alok Singhal
13. Februar 2010 um 2:51 Uhr
stackoverflow.com/questions/433895/…
– Ciro Santilli OurBigBook.com
27. Juni 2015 um 21:13 Uhr
Richard Pennington
In C ist ‘a’ eine ganzzahlige Konstante (!?!), also ist 4 für Ihre Architektur richtig. Es wird für die Zuweisung implizit in char umgewandelt. sizeof(char) ist per Definition immer 1. Der Standard sagt nicht, was Einheiten 1 sind, aber es sind oft Bytes.
+ 1 für “aber es sind oft Bytes”, ich kichere immer noch 🙂
– Binäre Sorge
12. Februar 2010 um 13:33 Uhr
Die Norm definiert die sizeof Operator als Rückgabe der Größe in Bytealso ist es nicht häufig, sondern immer. Im zweiten Absatz von ‘Der sizeof-Operator’: ‘Der sizeof-Operator liefert die Größe (in Bytes) seines Operanden.’
– David Rodríguez – Dribeas
12. Februar 2010 um 14:28 Uhr
Ich schaudere immer, wenn ich in SO-Posts “implizit gecastet” lese. Es gibt keinen impliziten Cast: Ein Cast ist immer eine explizite Konvertierung. Der C-Standard sagt in 6.3: „Mehrere Operatoren wandeln Operandenwerte automatisch von einem Typ in einen anderen um implizite Konvertierungsowie solche, die aus einer Cast-Operation resultieren (an explizite Konvertierung).”. Sie möchten “implizit konvertiert” sagen.
– Johannes Schaub – litb
12. Februar 2010 um 15:49 Uhr
sizeof() misst (integer, glaube ich) Vielfache von CHAR_BITS. Nicht mehr und nicht weniger. sizeof(char) == 1 per Definition. Die Anzahl der Bits in einem anderen Typ kann durch Multiplizieren von sizeof(type) mit CHAR_BITS ermittelt werden. Natürlich haben die meisten (wenn nicht alle) Plattformen CHAR_BITS von 8.
– Vatine
12. Februar 2010 um 16:17 Uhr
Es sind immer Bytes. Es dürfen keine Oktette sein.
– Leichtigkeitsrennen im Orbit
17. Juli 2015 um 13:29 Uhr
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 diese Frage für eine ausführlichere Diskussion.
Ich habe nach der Beförderung/dem Casting gefragt, die zwischen den beiden Datentypen stattfindet, während die Diskussion/Antwort dies nicht beantwortet.
– legends2k
12. Februar 2010 um 13:46 Uhr
@legends2K Sie haben gefragt: “Wenn die Größe eines Zeichens eins ist, warum gibt mir ‘c’ 4?” Da diese Antwort und die von mir verlinkte Frage erklären, dass ‘a’ eine Größe von == 4 hat, findet offensichtlich kein Casting oder keine Werbung statt.
– anon
12. Februar 2010 um 13:49 Uhr
Brunnen. Darunter befindet sich eine detaillierte Form der Frage, die lautet: “Gibt es unter der Haube eine implizite Typumwandlung von diesem 4-Byte-Wert auf einen 1-Byte-Wert, wenn er der char-Variablen zugewiesen wird?” Auch das gehört dazu, glaube ich.
– legends2k
12. Februar 2010 um 13:53 Uhr
Es gibt keine Förderung. In C hat ‘a’ den Typ int. In den meisten C-Implementierungen ist ‘a’ genau dasselbe wie 97. In C++ hat ‘a’ den Typ char.
– gnasher729
11. April 2014 um 14:02 Uhr
Es ist das normale Verhalten der sizeof Betreiber (vgl Wikipedia):
Für einen Datentyp sizeof gibt die Größe des Datentyps zurück. Zum chardu bekommst 1.
Für einen Ausdruck sizeof gibt die Größe des Typs der Variablen oder des Ausdrucks zurück. Als Zeichenliteral wird as typisiert intdu bekommst 4.
Dies wird in ISO C11 behandelt 6.4.4.4 Character constants obwohl es gegenüber früheren Standards weitgehend unverändert ist. Das heißt es in Absatz /10:
Eine ganzzahlige Zeichenkonstante hat den Typ int. Der Wert einer ganzzahligen Zeichenkonstante, die ein einzelnes Zeichen enthält, das einem Einzelbyte-Ausführungszeichen zugeordnet ist, ist der numerische Wert der Darstellung des zugeordneten Zeichens, interpretiert als Ganzzahl.
t0mm13b
Gemäß den ANSI-C-Standards a char wird zu einem befördert int In dem Kontext, in dem Ganzzahlen verwendet werden, haben Sie einen ganzzahligen Formatbezeichner in verwendet printf daher die unterschiedlichen Werte. Ein Zeichen ist normalerweise 1 Byte groß, aber das ist eine Implementierung, die auf der Grundlage der Laufzeit und des Compilers definiert wird.
Das Integer-Format bezieht sich auf sizeof(‘a’) und nicht auf ‘a’, daher sehe ich nicht, wie dieses Argument gilt.
– SmacL
12. Februar 2010 um 13:33 Uhr
Der C-Standard besagt, dass ein Zeichenliteral vom Typ int ist – es hat die Größe von int und es ist keine Beförderung beteiligt.
– anon
12. Februar 2010 um 13:35 Uhr
Ihre Antwort scheint darauf hinzudeuten, dass der C-Compiler beim Kompilieren eines Programms eine Formatzeichenfolge überprüft, die von einer Bibliotheksfunktion verwendet wird. Sind Sie sicher, dass dies der Fall ist?
– heijp06
12. Februar 2010 um 13:36 Uhr
Was wäre, wenn es scanf(“%s\n”,format) ; printf(format, sizeof(char), sizeof(‘a’)); und Sie würden “%d, %d\n” eingeben, wenn Sie dazu aufgefordert werden? In diesem Fall hat der Compiler keine Möglichkeit, die Variablentypen a’priori zu kennen und muss den Auslassungsoperator blind verwenden, wie es beabsichtigt ist?
– SF.
12. Februar 2010 um 13:36 Uhr
@Peter van der Heijden: Sie haben Recht, eine Formatzeichenfolge und ihre Bezeichner haben nichts mit den Typen der dahinter übergebenen Variablen zu tun. gcc, gibt Warnungen aus, wenn sie nicht übereinstimmen, aber es kompiliert problemlos mit nicht übereinstimmenden Typen, unter der Annahme, dass Sie mehr wissen als der Compiler. Das ‘a’ hat jedoch eine Größe von und befindet sich nicht in einem “ganzzahligen Kontext”. Die Aufrufe von sizeof geben size_t zurück, von dem ich glaube, dass es im Allgemeinen auf eine Ganzzahl ohne Vorzeichen typisiert ist.
– Michael Speer
12. Februar 2010 um 14:02 Uhr
Das Integer-Format bezieht sich auf sizeof(‘a’) und nicht auf ‘a’, daher sehe ich nicht, wie dieses Argument gilt.
– SmacL
12. Februar 2010 um 13:33 Uhr
Der C-Standard besagt, dass ein Zeichenliteral vom Typ int ist – es hat die Größe von int und es ist keine Beförderung beteiligt.
– anon
12. Februar 2010 um 13:35 Uhr
Ihre Antwort scheint darauf hinzudeuten, dass der C-Compiler beim Kompilieren eines Programms eine Formatzeichenfolge überprüft, die von einer Bibliotheksfunktion verwendet wird. Sind Sie sicher, dass dies der Fall ist?
– heijp06
12. Februar 2010 um 13:36 Uhr
Was wäre, wenn es scanf(“%s\n”,format) ; printf(format, sizeof(char), sizeof(‘a’)); und Sie würden “%d, %d\n” eingeben, wenn Sie dazu aufgefordert werden? In diesem Fall hat der Compiler keine Möglichkeit, die Variablentypen a’priori zu kennen und muss den Auslassungsoperator blind verwenden, wie es beabsichtigt ist?
– SF.
12. Februar 2010 um 13:36 Uhr
@Peter van der Heijden: Sie haben Recht, eine Formatzeichenfolge und ihre Bezeichner haben nichts mit den Typen der dahinter übergebenen Variablen zu tun. gcc, gibt Warnungen aus, wenn sie nicht übereinstimmen, aber es kompiliert problemlos mit nicht übereinstimmenden Typen, unter der Annahme, dass Sie mehr wissen als der Compiler. Das ‘a’ hat jedoch eine Größe von und befindet sich nicht in einem “ganzzahligen Kontext”. Die Aufrufe von sizeof geben size_t zurück, von dem ich glaube, dass es im Allgemeinen auf eine Ganzzahl ohne Vorzeichen typisiert ist.
– Michael Speer
12. Februar 2010 um 14:02 Uhr
14047000cookie-checkWarum ist in C sizeof(char) 1, wenn ‘a’ ein int ist?yes
Ich glaube, es hat mit der automatischen Integer-Promotion zu tun, jemand mit mehr Fakten als Glauben wird eine sachliche Antwort posten
– Binäre Sorge
12. Februar 2010 um 13:32 Uhr
@Roger: Er fragt nach dem Unterschied zwischen C und C++ sizeof(‘a’), während ich gefragt habe, ob eine Konvertierung stattfindet? Siehe Fragetext. Ich habe bereits abgeleitet, dass ‘a’ eine Ganzzahl in C ist.
– legends2k
12. Februar 2010 um 14:01 Uhr
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 meiner bescheidenen Meinung nach an Peter oder Neil gehen.
– Binäre Sorge
12. Februar 2010 um 15:30 Uhr
Sie haben Ihre Antwort erhalten, aber einen Kommentar: Sie können nicht drucken
size_t
Objekte mit"%d"
. Seitsizeof
Erträgesize_t
asize_t
Objekt, sollten Sie es mit drucken"%zu"
(C99) oder werfen Sie es zuunsigned long
und mit drucken"%lu"
(C89).– Alok Singhal
13. Februar 2010 um 2:51 Uhr
stackoverflow.com/questions/433895/…
– Ciro Santilli OurBigBook.com
27. Juni 2015 um 21:13 Uhr