首页  >  文章  >  后端开发  >  C 中的“char”、“signed char”和“unsigned char”真的不同吗?

C 中的“char”、“signed char”和“unsigned char”真的不同吗?

Linda Hamilton
Linda Hamilton原创
2024-10-26 04:22:31421浏览

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

C 中的字符类型:不同还是等效?

在 C 中,字符类型 (char) 的行为有时可能与有符号和无符号整数,导致混乱。具体来说,以下代码演示了这种差异:

<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>

此代码可以编译,但为 char 生成的结果与 int8 和 uint8 不同。这是因为 C 将 char、signed char 和 unsigned char 视为三种不同的类型。

相反,int 和 uint32 是等效的类型:

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

这种区别源于以下事实: char 历史上曾用于表示字符和存储数值。因此,C 通过将普通 char 视为与 int 不同的单独类型来保持向后兼容性。

要确定 char 使用两种表示中的哪一种,实现定义的 typedef char_traits::signed 是假如。如果这是 true,则 char 表现为有符号类型;否则,它表现为无符号类型。

以上是C 中的“char”、“signed char”和“unsigned char”真的不同吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn