ホームページ  >  記事  >  バックエンド開発  >  C および C での適切な整数型の選択

C および C での適切な整数型の選択

DDD
DDDオリジナル
2024-09-13 10:15:06287ブラウズ

Choosing an Appropriate Integer Type in C and C

導入

デニス・リッチーが C を作成したとき、彼は int (符号付き整数型) をデフォルトの型にしました。 int の サイズ (ビット数) は意図的に指定されていません。 C が標準化されたときでさえ、保証されているのは 最小 サイズだけでした。 その理論的根拠は、int のサイズは、特定の CPU における整数の「自然な」ワード サイズでなければならないということでした。

より小さい符号付き整数のみが必要で、少しスペースを節約したい場合は、Ritchie が短いものを教えてくれました。または、より大きな整数が必要な場合は、彼は long を提供してくれました。 (C99 では、long long を使用してさらに大きな整数が提供されました。) 符号なし整数のみが必要な場合は、宣言に unsigned を含めることができます。 C99 では、特定のサイズの符号付き整数型エイリアス (例: int32_t) と符号なし型エイリアス (例: uint32_t) も提供されました。

ただし、プログラミングでは、負の整数 (したがって符号付き整数型が必要) はほとんどの場合必要ありません。 文字列の長さ、オブジェクトの数、オブジェクトのサイズ、ファイルのサイズなどはすべて符号なしの整数です。 特定のサイズの型エイリアスは、符号付き整数よりもさらに少なくて済みます。

それでも、整数型を不適切に使用するコードを たくさん見てきました。 このようなコードは、読者 (数か月後のあなた自身を含む) に、不明確な情報や誤解を招く情報を伝える可能性があります。 適切な目的に応じて適切な整数型を選択することが最善です。

ガイドライン

整数型を選択するためのガイドラインは次のとおりです。

  • メモリ内ののバイト数を表す場合は、size_t 標準型エイリアスを使用します。

これは、memcpy()、strlen()、std::string::size() など、C と C の標準ライブラリの両方で使用される型なので、前例がたくさんあります。

  • ディスク上のファイルのサイズまたは位置を表す場合は、off_t POSIX タイプのエイリアスを使用します。

非常に大きなファイルを扱う場合、一部のプラットフォームでは、-D_FILE_OFFSET_BITS=64 を指定してコンパイルして off_t の 64 ビット バージョンを取得する必要がある場合があります。

    メモリ
  • 内のオブジェクトの数を表すときは、size_t も使用します。
  • これは、C と C の標準ライブラリ (fread() や fwrite() など) の両方で使用される型でもあります。

    特定のビット数内に含まれる値を表す必要がある場合、または特定の API に準拠する必要がある場合のみ
  • 、符号付き型には int8_t、int16_t、int32_t、または int64_t 型のエイリアスのいずれかを使用します。または、符号なし型の uint8_t、uint16_t、uint32_t、または uint64_t 型エイリアスのいずれか。
  • 通常、固定サイズの整数が
必要

となるのは、値を「外部化」するとき、たとえばディスクに書き込むときやソケット経由で送信するときだけです。 実際には特定のビット数が必要ない場合に固定サイズの整数を使用すると、リーダーに誤った情報が伝達されます。

さらに:

    ポインターの
  • 正確な

    サイズである必要がある必要がある整数値を表す場合は、標準の intptr_t または uintptr_t 型エイリアスを使用します。

  • 負の値が必要な場合にのみ、short、int、long、long long のいずれかを使用します。これより小さい値または大きい値が必要な場合を除き、int が優先されます。

  • 最後に:

それ以外の場合は、同様に unsigned short、unsigned、unsigned long、または unsigned long long のいずれかを使用します。より小さい値またはより大きい値が必要な場合を除き、unsigned が優先されます。
  • つまり、上記に挙げたケースのいずれかを扱っている場合を除き、デフォルトで符号なし型を使用します。

結論

適切な整数型を選択すると、リーダーに正しい情報が伝達され、実行時のチェックが不要になります。

エピローグ

元々、そして C99 までは、int は

暗黙的

型でした。つまり、型をまったく指定しなかった場合、それは int であると理解されていました。 例:

int パラメータを持ち int を返す関数を定義していますが、宣言では int が使用されていません。
power( x, n )  /* x and n are int; returns int */
{
    int p;
    for ( p = 1; n > 0; --n )
        p *= x;
    return p;
}

関数プロトタイプは C から C89 にバックポートされましたが、オリジナルの「K&R スタイル」関数定義は C23 まで引き続き許可されていました。 ANSI C 委員会は保守的な集団です。

さらに奇妙なことに、C99 以前では、次のような宣言で int を暗黙的に指定することもできました。


幸いなことに、そのような宣言はずっと前から違法です。
i;      // int i
*p;     // int *p
*a[4];  // int *a[4]
*f();   // int *f()

以上がC および C での適切な整数型の選択の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
前の記事:エルファンOS次の記事:エルファンOS