C++;联合位域任务 能不能让我明白为什么我要使用联合,并且用什么目的来处理CHIVE变量和位字段的相同地址(SHILDTS C++图书的任务)?换句话说,我为什么要使用union:
char ch; 结构字节位 //以二进制形式显示字符的ASCII码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;
#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写入的技巧从另一个人那里偷东西会有用的,因为这太普遍了。你没有回答我的任何问题?!