19

PLC などの外部デバイスとの通信に、固定幅の整数を使用する必要がある場合があります。また、これらを使用してビットマスクを定義し、画像データのビット操作を実行します。私の知る限り、C99 標準では int16_t のような固定幅の整数が定義されています。ただし、私が使用しているコンパイラ、VC++ 2008 は C99 をサポートしておらず、知る限り、Microsoft はそれをサポートする予定はありません。

私の質問は、C++ で固定幅整数を使用するためのベスト プラクティスは何ですか?

VC++ が __int16 のような非標準の固定幅整数を定義していることは知っていますが、非標準の型を使用することをためらっています。次の C++ 標準では、固定幅の整数が定義されますか?

4

6 に答える 6

18

#ifdefいくつかのディレクティブで問題を回避できます。

#ifdef _MSC_VER
   typedef __int16 int16_t
#else
   #include <stdint.h>
#endif
于 2009-04-09T15:47:05.263 に答える
12

Boostには、すべてのC99タイプなどのtypedefがあります: 「Boostintegerlibrary」

于 2009-04-09T15:52:39.867 に答える
7

ファイルをインクルードして、<stdint.h>などのタイプの定義を取得しますuint16_t。VC ++は<stdint.h>デフォルトでは付属していませんが、そのファイルはいくつかの場所から入手できます。 ウィキペディアにはいくつかのリストがあり、グーグルはあなたをもっとたくさん見つけるでしょう。

于 2009-04-09T15:50:31.353 に答える
3

次のC++標準は固定幅の整数を定義しますか?

はい。

Mehrdadが言ったように、あなたは#ifdefs今のところ使うことができます。別の方法は、いくつかの手の込んだテンプレートマジックです。Boostは、この方向に何か、BoostIntegerライブラリを持っています。

于 2009-04-09T15:50:38.687 に答える
1

stdint.hmingw パッケージで入手可能な Danny Smith による パブリック ドメイン (GPL ではなく、真のパブリック ドメイン) バージョンを使用しました。

VC 8 以外のコンパイラ (主に VC6) でコンパイルするには、そのバージョンを微調整する必要がありました。

そのうち、VC6 互換バージョンをどこかに投稿する日が来るかもしれません。変更はかなりマイナーなもので、64 ビット型に VC6 固有のキーワードを使用するためのいくつかのマクロトリックです。VC6 のサポートが必要ない場合は、おそらく mingw バージョンで十分です。

于 2009-04-09T16:09:54.630 に答える
0

とるべきさまざまな道があります。ほとんどの環境では、short intsは16ビット、long intsは32ビットであると見なされます(long単純に宣言すると、これが暗黙的に示されますint)。typedef独自のint16タイプの場合は、おそらく。を使用することになりますshort int

もう1つの可能性は、構造体のビットフィールドにあります。あなたは次のようなことを言うことができます:

struct x {
    int a : 16;
    int b : 5;
    ...
};

などなど。次に定義する場合:

struct x myvar;
myvar.a = 54;

myvar.aは16ビットを保持し、myvar.bは5ビットを使用することを確認できます。myvarの合計サイズは、すべてのビットが構成するものに切り上げられます。もちろん、他のフィールドのサイズも含まれます。

于 2009-04-09T15:52:30.537 に答える