Heim > Backend-Entwicklung > C++ > Hauptteil

Sind „char', „signed char' und „unsigned char' in C wirklich unterschiedlich?

Linda Hamilton
Freigeben: 2024-10-26 04:22:31
Original
420 Leute haben es durchsucht

  Are `char`, `signed char`, and `unsigned char` Truly Distinct in C  ?

Zeichentypen in C: Eindeutig oder gleichwertig?

In C kann sich das Verhalten von Zeichentypen (char) manchmal von dem von unterscheiden vorzeichenbehaftete und vorzeichenlose Ganzzahlen, was zu Verwirrung führt. Konkret veranschaulicht der folgende Code diesen Unterschied:

<code class="cpp">#include <iostream>

typedef   signed char       int8;
typedef unsigned char      uint8;

struct TrueType {};
struct FalseType {};

template <typename T>
struct isX
{
   typedef typename T::ikIsX ikIsX;
};

template <>            struct isX<char  >  { typedef FalseType ikIsX; };
template <>            struct isX<int8  >  { typedef FalseType ikIsX; };
template <>            struct isX<uint8 >  { typedef FalseType ikIsX; };

template <typename T> bool getIsTrue();
template <>           bool getIsTrue<TrueType>() { return true; }
template <>           bool getIsTrue<FalseType>() { return false; }

int main(int, char **t )
{
   cout << getIsTrue< isX<char>::ikIsX  >() << endl;
   cout << getIsTrue< isX<int8>::ikIsX  >() << endl;
   cout << getIsTrue< isX<uint8>::ikIsX  >() << endl;
}</code>
Nach dem Login kopieren

Dieser Code wird kompiliert, erzeugt jedoch andere Ergebnisse für char als für int8 und uint8. Dies liegt daran, dass C „char“, „signed char“ und „unsigned char“ als drei verschiedene Typen behandelt.

Im Gegensatz dazu sind int und uint32 äquivalente Typen:

<code class="cpp">template <>            struct isX<int   >  { typedef FalseType ikIsX; };
template <>            struct isX<unit32>  { typedef FalseType ikIsX; };</code>
Nach dem Login kopieren

Diese Unterscheidung ergibt sich aus der Tatsache, dass char wurde in der Vergangenheit sowohl zur Darstellung von Zeichen als auch zum Speichern numerischer Werte verwendet. Infolgedessen behält C die Abwärtskompatibilität bei, indem es einfach char als separaten Typ behandelt, der sich von int unterscheidet.

Um zu bestimmen, welche der beiden Darstellungen char verwendet, wird die durch die Implementierung definierte Typdefinition char_traits::signed verwendet bereitgestellt. Wenn dies zutrifft, verhält sich char wie ein vorzeichenbehafteter Typ. andernfalls verhält es sich wie ein vorzeichenloser Typ.

Das obige ist der detaillierte Inhalt vonSind „char', „signed char' und „unsigned char' in C wirklich unterschiedlich?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!