Zeichentypen in C: Eindeutig oder gleichwertig?
In C kann das Verhalten von Zeichentypen (char) manchmal von dem von abweichen vorzeichenbehaftete und vorzeichenlose Ganzzahlen, was zu Verwirrung führt. Konkret veranschaulicht der folgende Code diesen Unterschied:
#include
typedef signed char int8;
typedef unsigned char uint8;
struct TrueType {};
struct FalseType {};
template
struct isX
{
typedef typename T::ikIsX ikIsX;
};
template struct isX { typedef FalseType ikIsX; };
template struct isX { typedef FalseType ikIsX; };
template struct isX { typedef FalseType ikIsX; };
template bool getIsTrue();
template bool getIsTrue() { return true; }
template bool getIsTrue() { return false; }
int main(int, char **t )
{
cout ::ikIsX >() ::ikIsX >() ::ikIsX >() 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:
template struct isX { typedef FalseType ikIsX; };
template struct isX { typedef FalseType ikIsX; };
Diese Unterscheidung ergibt sich aus der Tatsache, dass char in der Vergangenheit sowohl zur Darstellung von Zeichen als auch zur Speicherung numerischer Werte verwendet wurde. 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, ist die durch die Implementierung definierte Typdefinition char_traits::signed bereitgestellt. Wenn dies zutrifft, verhält sich char wie ein vorzeichenbehafteter Typ. andernfalls verhält es sich wie ein vorzeichenloser Typ.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3