Character Types in C : Distinct or Equivalent?
In C , the behavior of character types (char) can sometimes differ from that of signed and unsigned integers, leading to confusion. Specifically, the following code demonstrates this difference:
<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>
This code compiles but produces different results for char than for int8 and uint8. This is because C treats char, signed char, and unsigned char as three distinct types.
In contrast, int and uint32 are equivalent types:
<code class="cpp">template <> struct isX<int > { typedef FalseType ikIsX; }; template <> struct isX<unit32> { typedef FalseType ikIsX; };</code>
This distinction stems from the fact that char has historically been used for both representing characters and storing numeric values. As a result, C maintains backward compatibility by treating plain char as a separate type, distinct from int.
To determine which of the two representations char uses, the implementation-defined typedef char_traits
The above is the detailed content of Are `char`, `signed char`, and `unsigned char` Truly Distinct in C ?. For more information, please follow other related articles on the PHP Chinese website!