gpt4 book ai didi

c++ - union 存储多个值

转载 作者:行者123 更新时间:2023-11-30 05:23:40 31 4
gpt4 key购买 nike

代码如下:

#include <iostream>

union mytypes_t {
char c;
int i;
float f;
double d;
} mytypes;

int main() {

mytypes.c = 'z';
mytypes.d = 4.13021;
mytypes.f = 41.7341;

cout << mytypes.d << endl;
return 0;
}

程序输出 4.13021(声明为 double 值)。当我尝试输出 mytypes.c 时,它打印出一个空白方 block (表示字符未正确显示)。

根据我对 union 的理解,它不应该只包含单一类型的单一值吗?如果这是真的,那么它不是一个值为 41.7341 的 float ,因此将其称为 double 或 char 会引发错误吗?

最佳答案

如其他答案所述,所有 union 成员都占用相同的内存空间。您始终可以将内存解释为基本类型,但结果可能出乎意料。

我编写了代码以十六进制打印出一些细节。您可以看到内存会随着每个连续值的分配而改变。当分配 float 时,double 不会完全改变,因此输出值接近原始值。这只是类型大小和硬件架构的副作用。

作为旁注,为什么使用 cout 打印十六进制字符如此痛苦。

#include <iomanip>
#include <iostream>
#include <string.h>

union mytypes_t {
unsigned char a[8];
char c;
int i;
float f;
double d;
} mytypes;

int main() {

memset(&mytypes,0,8);

std::cout << "Size of the union is: " << sizeof(mytypes) << std::endl;
mytypes.c = 'z';
for(int i=0;i<8;i++)
printf("%02x ", mytypes.a[i]);
printf("\n");

mytypes.d = 4.13021;
for(int i=0;i<8;i++)
printf("%02x ", mytypes.a[i]);
printf("\n");

mytypes.f = 41.7341;
for(int i=0;i<8;i++)
printf("%02x ",mytypes.a[i]);
printf("\n");

std::cout << mytypes.c << std::endl;
std::cout << mytypes.d << std::endl;
std::cout << mytypes.f << std::endl;
return 0;
}


Size of the union is: 8
7a 00 00 00 00 00 00 00 // The char is one byte
da 72 2e c5 55 85 10 40 // The double is eight bytes
b8 ef 26 42 55 85 10 40 // The float is the left most four bytes

4.13021
41.7341

关于c++ - union 存储多个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39045943/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com