C++;联合位域任务 能不能让我明白为什么我要使用联合,并且用什么目的来处理CHIVE变量和位字段的相同地址(SHILDTS C++图书的任务)?换句话说,我为什么要使用union:

C++;联合位域任务 能不能让我明白为什么我要使用联合,并且用什么目的来处理CHIVE变量和位字段的相同地址(SHILDTS C++图书的任务)?换句话说,我为什么要使用union:,c++,C++,char 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;

char 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";
}
#包括
#包括
使用名称空间std;
//将被解码的位字段
结构字节{
未签字的a:1;
无符号b:1;
无符号c:1;
未签名d:1;
无符号e:1;
无符号f:1;
无符号g:1;
无符号h:1;
};
联合比特{
char ch;
结构字节位;
}ascii码;
无效显示位(位b);
int main()
{
做{
cin>>ascii.ch;

cout因为本练习演示了使用位字段和并集将值分解为位

假设你知道什么是并集,如果你从一个二进制值中提取一些不太重复的东西,那么为了清晰起见,你可能需要使用它,而不是从移位和掩码的48个字符中提取两个24位整数

但对于任务中的示例,移位和掩码将是更干净的代码,因此您可能不会为此任务使用联合

void disp_bits(unsigned b)
{ // not tested
    for ( int shift = 7; shift >= 0;  --shift )
        cout <<  ( ( b >> shift ) & 1 ) << ' ';

    cout << "\n";
}
void disp_位(无符号b)
{//未测试
对于(int-shift=7;shift>=0;--shift)

cout>shift)&1)作为一个联合体,
ch
bit
都有重叠(共享)内存位置。将字符作为
ch
存储在其中,然后读取
为字符生成相应的位值。

联合用于网络协议中。它们还可以方便地伪造C中的多态性。通常,它们是一种特殊的用例


在这个例子中,它是一个虚构的例子来显示一个小代码。

< P>真正的答案是,你不会。使用BITFEAL在联盟(或全部)中,这是天生不可移植的,可能是未定义的。如果你需要用位来处理,你最好从ScLDLTC++ C++中使用C++位运算符。

任务。这就是你的错误所在,或者我们已经经历过这个问题了,代码可能会显示出不明确的行为。你可以考虑买一本新书:有一些很好的入门书籍。注意到Culio。H.S.H.也在那里偷偷溜走。C++说,这是不明确的。如果你使用UNIO的副本,我不清楚它是否仍然未定义。n来执行第二个操作。@Neil:我可能只是落后于时代(而且可能还遗漏了一些东西),但我的Stroustrup书说它们将占用相同的内存(假设它们大小相同)我并不是说这是对联盟的一个很好的使用。但是,操作的哪一部分是未定义的?C++标准称,一个联合实例只能容纳它的一个成员。尝试使用同一实例访问其他成员中的一个是未定义的。但是,这确实是“工作”。在我所知道的所有平台上,但这是标准所说的。基本上,联合的目的是类似于变体记录,而不是在类型之间映射单个位的方式。@Neil:这是有意义的。谢谢。根据标准,它是未定义的,但主要的编译器保证了向一个联合成员和readi写入的技巧从另一个人那里偷东西会有用的,因为这太普遍了。你没有回答我的任何问题?!