web-dev-qa-db-ja.com

Cで16ビット整数を定義する

Cで16ビットのサイズの整数を宣言する必要があります。

Shortおよびintサイズはマシンに依存することを知っています。

私は"stdint.h",を使用しようとしましたが、彼らは単にそうするようです

typedef short int16_t

だから私の質問は:

私は何かを見逃しており、ショートタイプは16ビット長を保証していますか?

いいえの場合、それを保証する代替手段はありますか?

17
sara

つまり、int16_tは、すべてのマシンではなく、yourマシンでshortとして定義されます。

絶対に16ビット整数型が必要な場合は、int16_tを使用してください。 stdint.h(C99、またはC++の場合はcstdintをサポートするものすべて)を提供するすべてのプラットフォームで適切に定義されます。

[編集]明確にするために、「stdint.h」ヘッダーファイルはC(またはC++)コンパイラによって提供されるため、その内容はコンパイラ、バージョン、システム、CPUアーキテクチャ、つまり、コンパイラスイートの作成者は、どの型がどのシステムでどのサイズを持っているかを正確に知っています。特定のアーキテクチャ上の特定のOS上の特定のコンパイラの特定のバージョンの定義についてのみ、1つのシステムでそのファイルを見るだけです(例:Darwin x86_64のGCC 4.2、WinNT AlphaのVisual Studio、またはSolaris IA32のICCなど)。一部のシステム、特に組み込みシステムでは、型のサイズが異なる場合があるため、shortは常に16ビットであるとは限らず、コンパイラーはそのビット長に使用する適切なサイズを認識します。

ファイルstdint.hを別のシステムで見ると、定義が異なるか、同じである可能性がありますが、その目的は、保証されたビット長の整数型の定義を提供することです。

33
maerics

いいえ、shortnot 16ビット長を保証します。基本的な整数データ型に関する唯一の保証は次のとおりです。

  • sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)
  • sizeof(char) == 1(注:charは8ビットを超える可能性があります!)
  • SHRT_MIN <= -32767およびSHRT_MAX >= 32767shortは少なくとも16ビットを意味します)
  • INT_MIN <= -32767およびINT_MAX >= 32767intは少なくとも16ビットを意味します)
  • LONG_MIN <= -2147483647およびLONG_MAX >= 2147483647longは少なくとも32ビットを意味します)
  • LLONG_MIN <= -9223372036854775807およびLLONG_MAX >= 9223372036854775807long longが少なくとも64ビットであることを意味します)

(C99§5.2.4.2.1およびAnnex E)

shortyourマシンでint16_tにtypedefされているという事実は、単にshortyourで16ビットであることを意味します=マシン。他の人のマシン(または同じマシンの他のコンパイル)で定義が同じになるという意味ではありません。

<stdint.h>を含めると、何らかの方法でint16_tが定義され、16ビット幅の符号付きの型であることが保証されます。正確なサイズの整数が必要な場合は、それらの正確なサイズのタイプを使用してください。

9
Adam Rosenfield

各マシンでは、これらの定義を利用できる場合とできない場合があります。

唯一のrealそれを行う安全な方法は、configureチェックなどを使用することです。

ただし、int16_tが存在する場合(およびconfigureがそれを検出した場合)、実際にshortが16ビットであるマシンではshortになります。 shortのサイズが異なる場合、そのシステムはint16_tを別のものに定義します。 IEでは、int16_tが使用可能な場合、2バイト長であると安全に想定できます。

3
Wes Hardaker

shortは、少なくとも16-bit幅。

かもね 16-bitシステムの幅は広いが32-bit別のシステム。

2
ouah