C# では、通常は abool*
を使用しません。これは、安全でないコードでのみ使用できるものです (オブジェクトのピン留めなど、他の多くのものをもたらします)。Abool*
はブール値へのポインターになります。ポインターは 4 バイトの長さであり、損失なしでバイトに変換することはできません。
なぜこれをしたいのですか、そしてどこでこれに遭遇しますか? 通常、C# でポインターを使用するユース ケースは、非常に具体的な要求 (つまり、API 呼び出しで、P/Invoke を使用して解決できる) がない限り、簡単にはありません。
編集: (q を編集したため)
次のコード スニペットは、ブール変数のアドレスを取得する方法と、そのポインターを に変換する方法を示していますint
(変換byte
は不可能です。4 バイトが必要です)。
unsafe
{
// get pointer to boolean
bool* boolptr = &mybool;
// get the int ptr (not necessary though, but makes following easier)
int* intptr = (int*)boolptr;
// get value the pointer is pointing at
int myint = *intptr;
// get the address as a normal integer
int myptraddress = (int) intptr;
}
あなたは「理想的には1バイトに4ビットを格納する」と言います。4 ビットのマシン アーキテクチャを使用している場合を除き、ブール値の取得と格納が非常に遅くなるため、強くお勧めしません。しかし、もっと重要なことは、ここでは C++ ではなく C# について話しているということです。C# は、ブール値がバイトとして格納され、各メモリ アドレスが 32 ビット アーキテクチャで 4 バイト長であることを示す CLR にバインドされています。つまり、ポインターは 4 バイト長です。したがって、bool* (bool へのポインター) を別のものに変換する質問は、4 バイト幅の整数またはその他のデータ型にのみ変換できます。
ヒント: フラグを使用すると、スペースを最大限に活用できます。これにより、列挙型がフラグごとに少し占有され、バイトごとに 8 つのブール値が得られます。