質問

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正確な幅の整数型

  1. typedef名 intN_t は、幅 N 、パディングビットなし、2の補数表現を持つ符号付き整数型を指定します。したがって、 int8_t は、正確に8ビットの幅を持つ符号付き整数型を示します。

  2. typedef名 uintN_t は、幅 N の符号なし整数型を指定します。したがって、 uint24_t は、幅が正確に24ビットの符号なし整数型を示します。

  3. これらのタイプはオプションです。ただし、実装が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はこれを既に処理しているため、このようなライブラリを実装する必要はありません。

http://gmplib.org/

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top