Cで16ビットのサイズの整数を宣言する必要があります。
Shortおよびintサイズはマシンに依存することを知っています。
私は"stdint.h",
を使用しようとしましたが、彼らは単にそうするようです
typedef short int16_t
だから私の質問は:
私は何かを見逃しており、ショートタイプは16ビット長を保証していますか?
いいえの場合、それを保証する代替手段はありますか?
つまり、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
を別のシステムで見ると、定義が異なるか、同じである可能性がありますが、その目的は、保証されたビット長の整数型の定義を提供することです。
いいえ、short
はnot 16ビット長を保証します。基本的な整数データ型に関する唯一の保証は次のとおりです。
sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)
sizeof(char) == 1
(注:char
は8ビットを超える可能性があります!)SHRT_MIN <= -32767
およびSHRT_MAX >= 32767
(short
は少なくとも16ビットを意味します)INT_MIN <= -32767
およびINT_MAX >= 32767
(int
は少なくとも16ビットを意味します)LONG_MIN <= -2147483647
およびLONG_MAX >= 2147483647
(long
は少なくとも32ビットを意味します)LLONG_MIN <= -9223372036854775807
およびLLONG_MAX >= 9223372036854775807
(long long
が少なくとも64ビットであることを意味します)(C99§5.2.4.2.1およびAnnex E)
short
がyourマシンでint16_t
にtypedefされているという事実は、単にshort
がyourで16ビットであることを意味します=マシン。他の人のマシン(または同じマシンの他のコンパイル)で定義が同じになるという意味ではありません。
<stdint.h>
を含めると、何らかの方法でint16_t
が定義され、16ビット幅の符号付きの型であることが保証されます。正確なサイズの整数が必要な場合は、それらの正確なサイズのタイプを使用してください。
各マシンでは、これらの定義を利用できる場合とできない場合があります。
唯一のrealそれを行う安全な方法は、configureチェックなどを使用することです。
ただし、int16_tが存在する場合(およびconfigureがそれを検出した場合)、実際にshortが16ビットであるマシンではshortになります。 shortのサイズが異なる場合、そのシステムはint16_tを別のものに定義します。 IEでは、int16_tが使用可能な場合、2バイト長であると安全に想定できます。
short
は、少なくとも16-bit
幅。
かもね 16-bit
システムの幅は広いが32-bit
別のシステム。