c++ - c 中的 union 一次存储一个数据

标签 c++ c unions

如果在内存中分配的 union 大小等于以字节为单位的最大数据类型成员,那么谁能告诉我编译器如何存储和获取两个数据 double d 和 int i(总共 8+4 个字节)(double on my机器是 8 个字节)。

#include<stdio.h>
union test {

    int i;
    double d;

};

int main()
{
   union test obj;
   obj.d=15.5;
   obj.i=200;

   printf("\nValue stored in d is %f",obj.d);
   printf("\nValue stored in i is %d",obj.i);
   printf("\n size of obj is %d ",sizeof(obj));

}

**Output is : Value stored in d is 15.500000
Value stored in i is 200
 size of obj is 8**

最佳答案

它可以存储两者的方式是“纯运气”。我只是假设您的计算机体系结构使用 IEEE 754 float 并尝试解释您所看到的内容。您的 union 确实只使用了八个字节,但 15.5 在十六进制中看起来像这样:402F000000000000。如您所见,低四个字节完全为零。现在让我们将最低的四个字节设置为整数 200,看看八个字节的值会发生什么。这给了我们 402F0000000000C8。现在假设您现在将所有八个字节作为 double 读回,在 IEEE754 中您得到 15.500000000000355,打印时将四舍五入为 15.5,看起来 union 可以存储 double 和整数。

所有这些都说像这样访问 union 体的两个成员在 C++ 中是未定义的行为,至少在 C++11 之前是这样(尽管它在我所知道的所有平台上的行为都是合乎逻辑的),所以这很简单您观察到的行为的一种可能解释。不过在 C 语言中它似乎是完全合法的。

关于c++ - c 中的 union 一次存储一个数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32027348/

相关文章:

c++ - 混淆后缀表达式和运算符的语法

c++ - 将字符串文字分配给 char*

将大整数转换为十进制字符串

c++ - 常量 union 对象有什么用?

c++ - Google语音识别(cpp示例):对AssignDescriptors()的 undefined reference

c++ - 从 C++ 函数返回指针或引用

从两个不同的 C DLL 调用同名的两个函数

c - 按字母顺序排序插入双向链表

C++ 将 NAN 值分配给 union 内的 float

C: typedef union