21

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

shortとintのサイズはマシンに依存することを私は知っています。

使ってみまし"stdint.h",たが、単純に使っているようです

typedef short int16_t

だから私の質問は:

私は何かが足りず、短いタイプは16ビット長を保証しますか?

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

4

4 に答える 4

39

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

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

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

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

于 2012-03-21T21:40:38.487 に答える
10

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

  • sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)
  • sizeof(char) == 1(注:acharはまだ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および付録E)

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

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

于 2012-03-21T21:48:17.860 に答える
3

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

それを行うための唯一の本当に安全な方法は、構成チェックなどを使用することです。

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

于 2012-03-21T21:41:47.053 に答える
2

short少なくとも16-bit幅が広いことが保証されているだけです。

それは16-bitあなたのシステムでは広くなる可能性がありますが32-bit、別のシステムではそうです。

于 2012-03-21T21:54:35.953 に答える