C では、「char」、「signed char」、および「unsigned char」は本当に区別されますか?

Linda Hamilton
リリース: 2024-10-26 04:22:31
オリジナル
420 人が閲覧しました

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

C の文字型: 別個のものか同等ですか?

C では、文字型 (char) の動作が、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 を 3 つの異なる型として扱うためです。

対照的に、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 が 2 つの表現のどちらを使用するかを決定するには、実装定義の typedef char_traits::signed が使用されます。提供された。これが true の場合、char は signed 型として動作します。それ以外の場合は、符号なし型として動作します。

以上がC では、「char」、「signed char」、および「unsigned char」は本当に区別されますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!