Кто-то может убрать меня, почему я использовал бы объединение и с какой цель тот же адрес для cin'ed переменного и битового поля (задача из книги C++ Schildts)? Другими словами, почему был бы я использовать объединение для:
символ ch; байт структуры укусил;
//Отобразите код ASCII в двоичном файле для символов.
#include <iostream>
#include <conio.h>
using namespace std;
// a bit field that will be decoded
struct byte {
unsigned a : 1;
unsigned b : 1;
unsigned c : 1;
unsigned d : 1;
unsigned e : 1;
unsigned f : 1;
unsigned g : 1;
unsigned h : 1;
};
union bits {
char ch;
struct byte bit;
} ascii ;
void disp_bits(bits b);
int main()
{
do {
cin >> ascii.ch;
cout << ": ";
disp_bits(ascii);
} while(ascii.ch!='q'); // quit if q typed
return 0;
}
// Display the bit pattern for each character.
void disp_bits(bits b)
{
if(b.bit.h) cout << "1 ";
else cout << "0 ";
if(b.bit.g) cout << "1 ";
else cout << "0 ";
if(b.bit.f) cout << "1 ";
else cout << "0 ";
if(b.bit.e) cout << "1 ";
else cout << "0 ";
if(b.bit.d) cout << "1 ";
else cout << "0 ";
if(b.bit.c) cout << "1 ";
else cout << "0 ";
if(b.bit.b) cout << "1 ";
else cout << "0 ";
if(b.bit.a) cout << "1 ";
else cout << "0 ";
cout << "\n";
}
Как объединение, оба ch
и bit
имеют перекрывающуюся (общую) область памяти. Если сохранить в ней символ как ch
, а затем прочитать bit
, то будут получены соответствующие битовые значения для этого символа.
Реальный ответ - вы бы не сделали. Использование битовых полей в объединениях (или вообще), как это, по своей сути непереносимо и может быть неопределенным.Если вам нужно возиться с битами, вам гораздо лучше использовать побитовые операторы C ++.
Объединения используются в сетевых протоколах. Они также могут быть удобны для имитации полиморфизма в C. Как правило, они представляют собой особый случай использования.
В этом примере это своего рода фиктивный пример, демонстрирующий небольшой код.
Поскольку упражнение демонстрирует разбиение значения на биты с помощью битового поля и объединения.
Предполагая, что вы знаете, что такое объединение, если бы вы извлекали что-то менее повторяющееся из двоичного значения, вы могли бы использовать его для ясности, вместо того, чтобы делать, скажем, два 24-битных целых числа из 48 символов с помощью сдвигов и масок.
Но для примера в задаче, сдвиги и маски были бы гораздо более чистым кодом, поэтому вы, вероятно, не стали бы использовать союз для этой задачи.
void disp_bits(unsigned b)
{ // not tested
for ( int shift = 7; shift >= 0; --shift )
cout << ( ( b >> shift ) & 1 ) << ' ';
cout << "\n";
}