異なるアーキテクチャーのCのintのサイズ
-
05-07-2019 - |
質問
C言語の仕様では、各整数型の正確なサイズが規定されていないことを認識しています(例:int
)。
私が不思議に思っているのは、C(C ++ではなく)に特定のサイズの整数型を定義して、異なるアーキテクチャ間で同じになるようにする方法はありますか?いいね:
typedef int8 <an integer with 8 bits>
typedef int16 <an integer with 16 bits>
またはプログラムの他の部分を異なるアーキテクチャでコンパイルできるようにする他の方法。
解決
必要なのは<stdint.h>
で、C標準(<!> quot; C99 <!> quot;)に準拠するコンパイラが実装します。残念ながら、これにはMicrosoftは含まれていません。幸いなことに、オープンソースプロジェクトはWindowsにint32_t
を提供します。 msinttypes を参照してください。
これにより、uint32_t
および<=>に加えて、8、16、64、およびその他の多くを使用できます。
注:ヘッダーファイル自体は標準ではオプションではありませんが、ヘッダーのほとんどのタイプは個別にオプションです。一部はそうではありません。最も一般的に使用されるタイプはオプションですが、必要なタイプの使用を妨げるものは何もありません。問題は、実装がヘッダーを提供する場合、実際にはすべてのタイプを定義することです。
他のヒント
C99、 stdint.h で、 int8_t
および int16_t
。
いいえ、C標準は整数型の最小サイズを指定していますが、最大サイズについては保証しません。
そのサイズの型が利用可能な場合、実装は intN_t
型を提供します。クロスプラットフォームタグがあるため、正しいビット幅の型を持たない実装では、それらの型を提供する必要がないことに言及しただけです。
通常、(たとえば、 cc -D_INT16_IS_INT
および #ifdef
sで定義する設定で)特定のビットサイズに使用する正しいタイプを選択できます。 CHAR_BIT
および sizeof()
を使用して、Cコードでサポートする各プラットフォームに必要な定義を決定できます。
c1xドラフト(n1362)の関連セクションは次のとおりです。
7.18.1.1正確な幅の整数型
-
typedef名
intN_t
は、幅N
、パディングビットなし、2の補数表現を持つ符号付き整数型を指定します。したがって、int8_t
は、正確に8ビットの幅を持つ符号付き整数型を示します。 -
typedef名
uintN_t
は、幅N
の符号なし整数型を指定します。したがって、uint24_t
は、幅が正確に24ビットの符号なし整数型を示します。 -
これらのタイプはオプションです。ただし、実装が8、16、32、または64ビットの幅、パディングビットなしの整数型、および(符号付き型の)2の補数表現を持つ整数型を提供する場合、対応するtypedef名を定義する必要があります。
タイプの選択に関しては、次のようなもので十分です:
#ifdef INT32_IS_SHORT
typedef short INT32
#endif
#ifdef INT32_IS_INT
typedef int INT32
#endif
#ifdef INT32_IS_LONG
typedef long INT32
#endif
#ifdef
で各プラットフォームをチェックしない限り、簡単に実行できるとは思えません。しかし、多くのライブラリがすでにそのタスクを実行しています。 MSVCの場合は __ int8
、 __ int16
、&amp; c。 GTKライブラリには同様のtypedefがあります。
pstdint.h をご覧ください。これはstdint.hの移植可能な実装であり、C99コンパイラのサポートを必要としません。
私が知る限り、答えはノーです。異なるプラットフォーム用にコーディングし、#if /#elseを使用して特定のプラットフォーム用にtypedefを使用します。たとえば、Win32の場合:typedef int int32;
数値に符号なしcharのベクトルを使用する算術ライブラリをいつでも作成できます。そうすれば、任意のビット長の数字を使用でき、ビット長を変えることさえできます。
実際には、GNU MPはこれを既に処理しているため、このようなライブラリを実装する必要はありません。