Cの整数型に関する完全な真実

まず、いくつかの質問:



  1. char



    型のデフォルトはcharacterですか? int



    どうですか?
  2. (signed char *)



    への暗黙的なキャストは(char *)



    ですか? そして、 int



    についても同じですか?
  3. unsigned char



    は何ビットありますか?
  4. int



    配置されることが保証されている最大数はいくつですか? そして最低限?
  5. long



    型は間違いなくchar



    よりも大きいですよね?


もちろん、お気に入りのコンピューターのお気に入りのシステムでお気に入りのコンパイラーを使用してこれらの質問に対する答えを実験的に探すことは、良い考えではありません。 言語標準(C99以降)について話している。



これらの質問に自信を持って正しく回答できる場合は、この記事は役に立ちません。 そうでなければ、それを読むのに10分を費やすことは非常に便利です。



私はあなたが答えたと仮定します
  1. 両方とも重要です。
  2. 両方とも合法です。
  3. 8。
  4. 2147483647. -214748364 8
  5. もちろん、キャップ。




そして、正しい答えは
  1. char



    規制なし、 int



    署名済み。
  2. int



    場合は正当ですが、 char



    場合はそうではありません。
  3. 少なくとも8。
  4. 32767。-32767
  5. 一般的に言えば、いいえ。








signed



およびunsigned



について



char



を除くすべての整数型char



、デフォルトで符号付きです。



char



状況はより複雑です。 標準でsigned char



char



signed char



unsigned char



3つの異なるタイプが確立されています。 特に、タイプ(signed char *)



ポインターを暗黙的にタイプ(char *)



キャストすることはできません。



正式にはこれらは3つの異なるタイプですが、実際にはchar



signed char



またはunsigned char



いずれかchar



同等です-コンパイラの選択(標準は特定のものを必要としません)。



コメントに char



詳細を書きました。



unsigned char



サイズについて



unsigned char



型は、マシンバイトの抽象化です。 このタイプの重要性は、Cがメモリを最も近いバイトにしかアドレス指定できないことです。 ほとんどのアーキテクチャでは、バイトサイズは8ビットですが、例外があります。 たとえば、36ビットアーキテクチャのプロセッサには通常9ビットのバイトがあり、一部のTexas Instruments DSPでは、バイトは16ビットまたは32ビットで構成されています。 古代のアーキテクチャには、4、5、または7ビットの短いバイトがあります。



標準Cは、古いアーキテクチャを放棄せざるを得ず、少なくとも 8ビットのバイトが必要です。 このプラットフォームの特定の値( CHAR_BIT



2) )は、ヘッダーファイルlimits.h



記録されます。



Cの整数型のサイズ



Cは移植性があるため、基本的な整数型( char



short



int



など)のサイズは厳密には設定されていませんが、プラットフォームによって異なります。 ただし、これらのタイプは移植性がない

それらのサイズは完全に任意でした。標準は、すべての基本的な整数型に対して受け入れられる値の最小範囲を確立します。 すなわち





標準では、 unsigned char



最大値は2 CHAR_BIT -1であることが必要です(前の段落を参照)。



標準では、 sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)



です。 したがって、 sizeof(char)=sizeof(long)=32



というタイプの状況は非常に正当です。 テキサス・インスツルメンツのDSPの一部はそうです。



このプラットフォームのこれらの範囲の特定の値は、ヘッダーファイルlimits.h



指定されています。



C99の新しいタイプ



C99がlong long



型を追加した後、整数型と混乱はさらに大きくなりました。 整理するために、標準では、ヘッダーファイルstdint.h



導入しました。これは、 int16_t



(16ビットに等しい)、 int_least16_t



(16ビットに対応できる最小タイプ)、 int_fast16_t



(少なくとも16ビット、プラットフォーム)など



最小タイプと高速タイプは、実際には、上記で説明したint



short



long



などのタイプの置換であり、さらにプログラマーに速度とサイズの選択を与えるだけです。



厳密なサイズを示すint16_t



ような型は、移植性に影響します。たとえば、9ビットバイトのアーキテクチャでは、16ビットのレジスタが単に見つからない場合があります。 したがって、ここの標準では、これらのタイプはオプションであると明確に述べています。 しかし、どんなコードを書いても、すべての場合よりも少ない場合、ターゲットアーキテクチャは、ファミリ(たとえばx86またはAVR)に正確な最悪の場合でも修正されます。その内部では、バイトサイズは突然変更できず、移植性は実際に保持されます。 さらに、 int16_t



ような型は、 int_least16_t



int_fast16_t



よりも人気があり、低レベルのプログラミング(マイクロコントローラー、デバイスドライバー)でさえ、変数サイズの不確実性は単に許容できないためです。






1)便宜上、上位3つのアーキテクチャ+ OS +コンパイラは単にプラットフォームと呼ばれます

2)このマクロはUCHAR_BIT



を呼び出すUCHAR_BIT



UCHAR_BIT



適切ですが、互換性の理由から、それは呼ばれているものと呼ばれます。



All Articles