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 charcharsigned charunsigned 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は移植性があるため、基本的な整数型( charshortintなど)のサイズは厳密には設定されていませんが、プラットフォームによって異なります。 ただし、これらのタイプは移植性がない
それらのサイズは完全に任意でした。標準は、すべての基本的な整数型に対して受け入れられる値の最小範囲を確立します。 すなわち


標準では、 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ビット、プラットフォーム)など

最小タイプと高速タイプは、実際には、上記で説明したintshortlongなどのタイプの置換であり、さらにプログラマーに速度とサイズの選択を与えるだけです。

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



1)便宜上、上位3つのアーキテクチャ+ OS +コンパイラは単にプラットフォームと呼ばれます
2)このマクロはUCHAR_BITを呼び出すUCHAR_BITUCHAR_BIT適切ですが、互換性の理由から、それは呼ばれているものと呼ばれます。

Source: https://habr.com/ru/post/J156593/


All Articles