0

ビット配列を構築するには、ビットセット型を定義する必要があります。これらの配列間で、and/or/xor などのビット操作を (たとえば、それらを比較するために) 実行することができ、それらが支配的な操作です。ビットセット型としてどの型を使用すればよいですか?

型は、コンパイラが処理できる最も広い NOT SIMULATED 型であるべきだと思います。つまり、コンパイラが 64 ビット型をシミュレートする場合 (マシンまたは OS がそれをサポートしていない場合など)、単純な and 間の複合操作をマスクして、代わりに 32 ビット型を使用する必要があります。それを決定する方法は?

その他の質問:

新しい c99 ヘッダーはいくつかの型 (正確な幅の整数型) を定義します。

「これらは intN_t と uintN_t の形式です。両方の型は、パディング ビットのない正確な N ビットで表す必要があります。intN_t は 2 の補数の符号付き整数としてエンコードし、uintN_t は符号なし整数としてエンコードする必要があります。実装が型をサポートしない限り、これらの型はオプションです。幅が 8、16、32、または 64 の場合、対応する N を使用して対応する型に型定義します。その他の N はオプションです。

64ビット型をチェックする実装は最初のステップだと思いますよね?

私のプロジェクトでは、#マクロを定義する SDL ライブラリを使用しています。

#ifdef SDL_HAS_64BIT_TYPE
typedef int64_t     Sint64;
#ifndef SYMBIAN32_GCCE
typedef uint64_t    Uint64;
#endif
#else
/* This is really just a hack to prevent the compiler from complaining */
typedef struct {
    Uint32 hi;
    Uint32 lo;
} Uint64, Sint64;
#endif

したがって、おそらくそのマクロに応じてビットセット型の定義を作成できます (ただし、sdl のコードを独立して記述したいので、これは最適ではありません)。

について意見を聞かせてください。

4

2 に答える 2

1

エミュレートされていない整数型の最大サイズを決定する簡単な方法はなく、ほとんどの人はわざわざ試しません。2 つのアプローチのいずれかを取ることができ、どちらも機能します。

  1. 32 ビット整数はどこでも使用できるため、32 ビット整数を使用することを決定します。
  2. 32 ビットと 64 ビット (または 16 ビットと 128 ビット) のどちらのデータ型を使用するかを制御する構成マクロ (必ずしも SDL のものである必要はありません) を使用することを決定します。ビルドを構成するときに「正しい」値を指定します。

エミュレートされたものとネイティブのものを検出したい場合は、さまざまなサイズの乗算を使用して、テスト プログラムでいくつかのタイミング テストを実行することになるでしょう。

于 2011-06-04T06:10:10.043 に答える
0

シグナルセットとfdセットに対する従来のUnixの慣例は、使用することですunsigned long(実際には歴史的には使用されていたかもしれませんがlong、ビットセットに符号付き型を使用することは非常に悪い考えであり、ほぼ確実に未定義の動作につながります)。一部の古い16ビットマシンはlongシステムワードサイズよりも大きい可能性がありますが、その問題を抱えている最新のマシンを見つけるのは非常に難しいと思います。一方、64ビットWindowsには32ビットlongがあるため、最適なタイプを取得することはできませんが、簡単にするために、64ビットWindowsを使用することをお勧めします。

別のアプローチは、C99stdint.hを自由に使用できる場合は、を使用することuintptr_tです。それはほぼ確実にマシンワードサイズです。

単純さで間違いなく勝つさらに別のアプローチは、常にバイトを使用することです。

最後に、リトルエンディアンシステムでは、使用するタイプサイズに関係なく、メモリ内の表現は同じになることに注意してください。

于 2011-06-04T12:31:26.580 に答える