在C++中使用并集和hexa

Work with Unions and hexa in C++

本文关键字:hexa C++      更新时间:2023-10-16

我有以下关于Union的程序。我并没有真正与许多人合作过,但据我所知,Union的元素共享相同的内存空间。此外,当我第一次看老师的幻灯片时,我认为它是similar,类似于structs,但不是。无论如何,我试图打印Union值,但我不理解。有人告诉我为什么它只打印1而忽略前5个字符吗?第二个问题;有没有一种方法可以在不将ab转换为二进制的情况下计算a ^= b;?这是一个期中练习的问题,我认为有一种更快的方法可以解决,因为这是C++课程,而不是数字系统课程。

// Example program
#include <iostream>
#include <string>
union Combi {
 int i;
 short s;
};

int main()
{
 unsigned int a = 0xFF, b= 0x0F0F;
a ^= b;
 Combi c;
c.i = 0xFF0001;
std::cout << c.s<<" "<<a;
}

我认为short持有的比特数少于显示FF所需的比特数。可以将其视为0xffff掩码,从而隐藏所有高于该掩码的比特。

编辑:好的,更深入地说,int和short在内存中共享相同的位置。但是,当您指定格式时,您将获得该格式的内存数据(在内存中,它只是一堆比特)。

因此,整个联盟只占最大组成部分的大小;本例中的int。

假设它从0x00000000开始。

然后将int(整个内存段)设置为0xFF0001。

现在它看起来像0x00FF0001。

现在,您想将数据打印为short,但short通常只看起来像0x0000。因此,在这种情况下,我们忽略上半部分0x00FF,我们的缩写是剩余部分:0x0001。

因此你得到了1的输出。

并集是一种数据结构,可以通过不同的方式查看数据。编译器为c提供了足够的内存来存储其最长的条目。将0xFF0001指定给c.i时,也会指定c.s,因为它们重叠。当您告诉它打印c.s时,它会打印内存,但假设您只想看到short。这就是为什么您只看到1而看不到其他字符。

第二个问题;是否有计算CCD_ 19的方法;而不将CCD_ 20和CCD_?

是;事实上,程序就是这样做的(这是十六进制格式,而不是二进制)。如果您愿意,只需指定相应的十进制值,a ^= b将以完全相同的方式工作。用二进制或六进制格式写它只会让它更容易阅读。