2

私はtypedef独自の算術型 (Byte8、Int16、Int32、Float754 など) を調べて、それらが特定のビット数で構成されていることを確認しています (float の場合は、IEEE754 形式に準拠しています)。完全にクロスプラットフォームの方法でこれを行うにはどうすればよいですか?

私はあちこちで C/C++ 標準のスニペットを見てきましたが、たくさんあります。

"タイプ少なくとも xバイトです"

あまり多くはありません:

タイプ正確に xバイトです」。

typedef Int16 unsigned short int必ずしも 16 ビットの Int16 になるとは限らない場合、型が特定のサイズになることを保証するクロスプラットフォームの方法はありますか?

4

5 に答える 5

9

int8_t, int16_t, int32_t, int64_tで宣言された正確な幅の整数型を使用できます<cstdint>。このようにして、すべてのプラットフォームでサイズが固定されます

于 2012-10-31T06:42:02.407 に答える
6

正確なビット数を真に保証する唯一の方法は、ビットフィールドを使用することです:

struct X { 
    int abc : 14; // exactly 14 bits, regardless of platform
};

この方法で指定できるサイズにはある程度の上限があります。少なくとも では 16 ビット、intでは 32 ビットですlong(ただし、最近のプラットフォームでは、いずれも 64 ビットまで簡単に許可される場合があります)。ただし、これは算術 onX::abcが正確に 14 ビットを使用 (または少なくともエミュレート) することを保証しますが、a のサイズが 14 ビットを提供するために必要な最小バイト数であることを保証するものではありませstruct X(たとえば、与えられた 8 ビットバイト、そのサイズは、絶対に必要な 2 ではなく、簡単に 4 または 8 にすることができます)。

C および C++ 標準の両方に、固定サイズの型 ( 、int8_tなどint16_t) の仕様が含まれるようになりましたが、それらが存在するという保証はありません。プラットフォームが適切な型を提供する場合は必須ですが、それ以外の場合は存在しません。メモリが機能する場合、これらも 2 の補数表現を使用する必要があるため、16 ビットの 1 の補数整数型 (たとえば) を持つプラットフォームでは、int16_t.

于 2012-10-31T06:50:15.523 に答える
4

stdint.hで宣言されている型を見てください。これは標準ライブラリの一部であるため、(技術的には保証されていませんが) どこでも利用できることが期待されます。ここで宣言されている型にはint8_tuint8_tint16_tuint16_tint32_tuint32_tint64_tおよび がありuint64_tます。ローカル実装は、これらの型を、指定されたコンパイラとアーキテクチャの適切な幅の型にマップします。

于 2012-10-31T06:46:59.283 に答える
4

これは不可能です。

charが16 ビットまたは 32 ビットのプラットフォームもあります。

理論上、これが発生するプラットフォームがあると言っているわけではないことに注意してください...それは現実的で非常に具体的な可能性です(DSPなど)。

その種のハードウェアでは、演算に 8 ビットのみを使用する方法はまったくありません。たとえば、8 ビットの剰余演算が必要な場合は、自分でマスキング演算を行うしかありません。

C 言語は、この種のエミュレーションを提供しません...

C++ を使用すると、ほとんどの場合に期待されるネイティブの基本型のように動作するクラスを構築することができます(sizeof明らかに を除きます)。しかし、結果は本当にひどいパフォーマンスになります。

ハードウェアをその性質に反してこのように強制することが良い考えであるユースケースは考えられません。

于 2012-10-31T06:48:19.890 に答える
3

コンパイル時に C++ テンプレートを使用して、要件に適合する新しい型をオンザフライでチェックおよび作成することがsizeof()できます。

このコードを見てください: Compile time "if" .

要求されたタイプが利用できない場合、プログラムがコンパイルされない可能性が十分にあることに注意してください。それは単にそれがあなたのために働くかどうかにかかっています!

于 2012-10-31T06:50:49.120 に答える