Member 13535370 Ответов: 2

Bool array[8] to char conversation


Поэтому я хочу преобразовать массив bool длиной 8 в char. Но это не работает. Каковы же причины?

Upd. Буквально я хочу что-то такое, что делает функция std::bitset::to_ulong.

Что я уже пробовал:


void print(bool *b) {
без знака типа char *с = (неподписанные символ*)(б);
std::cout << *c;
}

2 Ответов

Рейтинг:
19

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-бит строит)!

Спасибо, что приняли мое решение.

Рейтинг:
0

CPallini

Ты не должен этого делать. Попробуй

#include <iostream>
using namespace std;

void print(bool *ba, size_t size)
{
  for ( size_t n = 0; n < size; ++n)
  {
    cout << ba[n];
    cout << ( n < size-1 ? ", " : "\n");
  }
}


int main()
{
  bool ba[] = { true, false, false };
  print(ba, sizeof(ba)/sizeof(ba[0]));
}


Member 13535370

Как это должно помочь мне? Эта функция просто выводит значения массива bool.

CPallini

Что же вам тогда нужно? Не могли бы вы привести пример (то есть вход и ожидаемый результат)?

Member 13535370

У меня есть правильный ответ в решении 2.
Я думал, что sizeof(bool[8]) == sizeof(char). Поэтому я хотел преобразовать bool[8] в char.

CPallini

Нет. Это определенная реализация. Смотрите, например
https://stackoverflow.com/questions/4897844/is-sizeofbool-defined

phil.o

Даже если бы они имели одинаковый размер в памяти (что не так уж точно, как сказал вам мистер Арндт), false был бы приведен к char \0, который является нулевым символом, а true-к char \1, который является символом SOH (начало заголовка); оба они не печатаются. Вы, кажется, путаете значение char с его текстовым представлением.

Member 13535370

Да. Вы правы. Я забыл, что я конвертирую в bool, а не в массив bool.