Heim > Backend-Entwicklung > C++ > Im Folgenden finden Sie englische Frage- und Antworttitel, die auf der Grundlage des von Ihnen bereitgestellten Artikelinhalts generiert wurden: Warum verhält sich „char' beim Vergleich von „char', „signed char' und „unsigned char' anders als ganzzahlige Typen bei der Vorlageninstanziierung?

Im Folgenden finden Sie englische Frage- und Antworttitel, die auf der Grundlage des von Ihnen bereitgestellten Artikelinhalts generiert wurden: Warum verhält sich „char' beim Vergleich von „char', „signed char' und „unsigned char' anders als ganzzahlige Typen bei der Vorlageninstanziierung?

Linda Hamilton
Freigeben: 2024-10-25 22:00:28
Original
1007 Leute haben es durchsucht

以下是根据您提供的文章内容生成的英文问答类标题:

Why does `char` behave differently from integer types in template instantiation when comparing `char`, `signed char`, and `unsigned char`?

Unterschiede im Verhalten zwischen char, signiertem char und unsigniertem char

Der folgende Code wird erfolgreich kompiliert, aber char verhält sich anders als ganzzahlige Typen.

cout << getIsTrue< isX<int8>::ikIsX  >() << endl;
cout << getIsTrue< isX<uint8>::ikIsX  >() << endl;
cout << getIsTrue< isX<char>::ikIsX  >() << endl;
Nach dem Login kopieren

Das Ergebnis sind drei Instanziierungsmuster für drei Typen: int8, uint8 und char. Warum passiert das?

Das Gleiche gilt nicht für ganze Zahlen: int und uint32 führen zu einer Musterinstanziierung, und signiertes int führt zu einer anderen.

Der Grund liegt wahrscheinlich darin, dass C char behandelt, signiertes Zeichen und unsigniertes Zeichen als drei verschiedene Typen. Während int dasselbe ist wie signiert int. Stimmt das oder übersehe ich etwas?

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

using namespace std;

typedef   signed char       int8;
typedef unsigned char      uint8;
typedef   signed short      int16;
typedef unsigned short     uint16;
typedef   signed int        int32;
typedef unsigned int       uint32;
typedef   signed long long  int64;
typedef unsigned long long uint64;

struct TrueType {};
struct FalseType {};

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


// Это  int==int32 неоднозначно
//template <>            struct isX<int  >    { typedef FalseType ikIsX; };  // Ошибка
template <>            struct isX<int32  >  { typedef FalseType ikIsX; };
template <>            struct isX<uint32 >  { typedef FalseType ikIsX; };


// Почему это не двусмысленно? char==int8
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 << sizeof(int8) << endl;  // 1
   cout << sizeof(uint8) << endl; // 1
   cout << sizeof(char) << endl;  // 1

   cout << getIsTrue< isX<int8>::ikIsX  >() << endl;
   cout << getIsTrue< isX<uint8>::ikIsX  >() << endl;
   cout << getIsTrue< isX<char>::ikIsX  >() << endl;

   cout << getIsTrue< isX<int32>::ikIsX  >() << endl;
   cout << getIsTrue< isX<uint32>::ikIsX  >() << endl;
   cout << getIsTrue< isX<int>::ikIsX  >() << endl;

}
Nach dem Login kopieren

Ich verwende g 4.something

Das obige ist der detaillierte Inhalt vonIm Folgenden finden Sie englische Frage- und Antworttitel, die auf der Grundlage des von Ihnen bereitgestellten Artikelinhalts generiert wurden: Warum verhält sich „char' beim Vergleich von „char', „signed char' und „unsigned char' anders als ganzzahlige Typen bei der Vorlageninstanziierung?. 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