В C # вы обычно не используете bool*
, который вы можете использовать только в небезопасном коде (который порождает множество других вещей, таких как закрепление объектов и т. Д.).bool*
будет указателем на логическое значение.Указатель имеет длину 4 байта и не может быть преобразован в байт без потерь.
Зачем вам это нужно и где вы сталкиваетесь с этим?Как правило, нет простого варианта использования указателей в C #, если только у вас нет особых требований (например, вызов API, но вы можете решить это с помощью P / Invoke).
EDIT: (потому что вы отредактировали q.)
В следующем фрагменте кода показано, как получить адрес логической переменной и как преобразовать этот указатель в int
(преобразование в byte
не являетсявозможно, нам нужно четыре байта).
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;
}
вы говорите "в идеале хранить 4 бита в байте".Если у вас нет 4-битной машинной архитектуры, я бы настоятельно советовался против нее, потому что это сделает поиск и хранение логических значений очень медленным.Но что более важно: вы говорите здесь на C #, а не на C ++.C # связан с CLR, в котором говорится, что логическое значение сохраняется в виде байта и что каждый адрес памяти имеет длину четыре байта в 32-битных архитектурах, что означает, что указатели имеют длину четыре байта.Следовательно, ваш вопрос о преобразовании bool * (указателя на bool) во что-то другое можно преобразовать только в целочисленный или другой тип данных шириной в четыре байта.
Совет: используя флаги, вы можете наилучшим образом использовать пространство: это заставляет типы enum занимать немного для каждого флага, что дает вам восемь логических значений для каждого байта.