「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > C++ では、「char」、「signed char」、および「unsigned char」は本当に区別されますか?

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

2024 年 11 月 5 日に公開
ブラウズ:214

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

C の文字型: 個別または同等?

C では、文字型 (char) の動作が C の動作と異なる場合があります。符号付き整数と符号なし整数が区別されるため、混乱が生じます。具体的には、次のコードはこの違いを示しています:

#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  >() 

このコードはコンパイルされますが、char の場合は int8 および uint8 の場合とは異なる結果が生成されます。これは、C が char、signed char、unsigned char を 3 つの異なる型として扱うためです。

対照的に、int と uint32 は同等の型です。

template             struct isX  { typedef FalseType ikIsX; };
template             struct isX  { typedef FalseType ikIsX; };

この区別は、char が歴史的に文字の表現と数値の格納の両方に使用されてきたという事実に由来しています。その結果、C はプレーン char を int とは異なる別の型として扱うことによって下位互換性を維持します。

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

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3