Warum ist in C sizeof(char) 1, wenn ‘a’ ein int ist?

Lesezeit: 7 Minuten

Benutzeravatar von legends2k
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

Benutzeravatar von Richard Pennington
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.

Benutzeravatar von t0mm13b
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

1404700cookie-checkWarum ist in C sizeof(char) 1, wenn ‘a’ ein int ist?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy