Jochen Arndt
Размер bool
значения зависят от реализации (компилятора). Это может быть один байт или больше. Общим является размер int
Вы можете проверить это, напечатав sizeof(bool)
.
Приведение указателя для разных типов будет работать только в том случае, если оба типа имеют одинаковый размер. Но даже тогда вы должны знать, что вы делаете (знать, как интерпретировать и использовать полученные данные).
Вы пытаетесь распечатать один символ (используйте *
оператор разыменования). Значение этого символа здесь снова зависит от реализации, но в большинстве случаев оно должно быть равно нулю или единице, которые оба не являются печатными символами.
Если вы хотите напечатать bool
значения вы можете использовать манипуляторы ввода-вывода для определения того, что будет напечатано (false / true или 0 / 1):
cout << std::boolalpha << booleanValue << '\n';
cout << std::noboolalpha << booleanValue << '\n';
Если вам нужно реальное преобразование, вы должны создать выходной массив, выполнить итерацию по логическому входному массиву и присвоить соответствующие значения:
unsigned char ucOut[8];
char strOut[9];
for (int i = 0, i < 8; i++)
{
ucOut[i] = b[i] ? 1 : 0;
// or
//ucOut[i] = static_cast<unsigned char>(b[i]);
strOut[i] = b[i] ? '1' : '0';
}
strOut[8] = '\0';
std::cout << strOut;
Обратите внимание, что вы можете использовать приведение внутри цикла, потому что это приведет к приведению одного значения, а не массива. Но он может использоваться только для двоичных значений, а не для печати символов.
[РЕДАКТИРОВАТЬ]
Обратите также внимание, что я использовал a
static_cast
. Если вы используете это в своем коде для указателей, компилятор выдаст ошибку. Избегайте старого кастинга в стиле C с помощью C++. Существует также оператор приведения C++ , который может привести указатели из вашего примера. Но при использовании такой (реинтерпретации) она (надеюсь) указывает на то, что автор кода знает, что он там делает.
[/РЕДАКТИРОВАТЬ]
Member 13535370
О, спасибо Вам за то, что вы указали, что bool занимает 1 байт. Таким образом, 1 bool буквально равен 1 char. Я совсем забыл об этом.
Jochen Arndt
- Нет! Я этого не писал. Я написал, что это зависит от используемого компилятора. Это может быть также размер int (4/8 байта с 32-/64-бит строит)!
Спасибо, что приняли мое решение.