理解C语言中的并集

理解C语言中的并集,c,C,你好,我想了解C语言中的联合是如何工作的。我创建了一个名为temperature的浮点数12345678 这将转换为二进制(25位): 101111000110001110 在我创建的名为temp_union的联合中,我创建了一个浮点变量(value2)和一个名为value1的4字节整数数组 然后将温度存储到union值2中 当我显示value1[0]时,是否应该打印浮点数的前8位?和值[1]下一个8位,值[2]下一个8位,依此类推 So displaying value1[0] as an i

你好,我想了解C语言中的联合是如何工作的。我创建了一个名为temperature的浮点数12345678

这将转换为二进制(25位): 101111000110001110

在我创建的名为temp_union的联合中,我创建了一个浮点变量(value2)和一个名为value1的4字节整数数组

然后将温度存储到union值2中

当我显示value1[0]时,是否应该打印浮点数的前8位?和值[1]下一个8位,值[2]下一个8位,依此类推

So displaying value1[0] as an integer, would be 78 (01001110)
Displaying value1[1] as an integer, would be 97 (01100001)
Displaying value1[2] as an integer, would be 188 (10111100)
相反,我得到以下信息:

value1[0]: 1262248270                                                                                                                          
value1[1]: 32766                                                                                                                               
value1[2]: 0                                                                                                                                   
value1[3]: 0 
我的代码如下:

 #include <stdio.h>

    int main()
    {
    float temperature = 12345678;

    union union_data_type {
      int  value1[4];
      float value2;
    };

    union union_data_type temp_union;

    temp_union.value2 = temperature;

    printf("\n Temperature float value: ");
    printf("%f", temp_union.value2);

    printf("\n  Value 0: ");
    printf("%i", temp_union.value1[0]);


    printf("\n  Value 1: ");
    printf("%i", temp_union.value1[1]);

    printf("\n  Value 2: ");
    printf("%i", temp_union.value1[2]);

    printf("\n  Value 3: ");
    printf("%i", temp_union.value1[3]);


    }
#包括
int main()
{
浮子温度=12345678;
联合数据类型{
int值1[4];
浮动值2;
};
联管节数据类型临时联管节;
temp_union.value2=温度;
printf(“\n温度浮动值:”);
printf(“%f”,临时联合值2);
printf(“\n值0:”);
printf(“%i”,临时联合值1[0]);
printf(“\n值1:”);
printf(“%i”,临时联合值1[1]);
printf(“\n值2:”);
printf(“%i”,临时联合值1[2]);
printf(“\n值3:”);
printf(“%i”,临时联合值1[3]);
}
当我显示
value1[0]
时,是否应该打印浮点数的前8位?和
值[1]
接下来的8位,
值[2]
接下来的8位,依此类推

So displaying value1[0] as an integer, would be 78 (01001110)
Displaying value1[1] as an integer, would be 97 (01100001)
Displaying value1[2] as an integer, would be 188 (10111100)
不可以。一个
int
通常是32位长。因此,在使用
temp\u union.value1[0]
的情况下,您将获得浮点值的前32位。 如果您想一次访问一个字节,请将union更改为

union union_data_type {
  uint8_t  value1[4];
  float value2;
};
为此,您必须
#包括

但就你对联合工作原理的理解而言,你是正确的。

浮点的大小通常是32位,也就是4字节。”int'通常也是4个字节,所以我假设你有

因此,在您的例子中,union由4个字节的浮点和16个字节的int数组组成。只有数组的前4个字节(value1[0])与float成员重叠

你的结合在记忆中看起来像下面这样

  addr     int value1[4]    float value2
 00000000  [0]  4 bytes       4 bytes
 00000004  [1]  4 bytes       ---
 00000008  [2]  4 bytes       ---
 0000000C  [3]  4 bytes       ---
其中addr在此表示从提供给您的堆栈位置的偏移量

初始化浮点时,也会初始化value1[0]。其余部分仍然未初始化,只是垃圾

float
通常由IEEE 754标准()中定义的编码表示,它的位由cpu和打印服务进行交互。
int
的相同位的解释不同


因此,您的结果显示value1[0],它是
float
位的
int
表示,以及数组中其他成员的未初始化值。

您有一个由4个整数组成的数组,而不是4个字节。
int value1[4]
和一个由4个字节组成的整数数组,称为value1。如果
int
是一个字节,您使用的是什么操作系统和编译器?提示::以十六进制打印整数值:
printf(“%x\n”,temp_union.value1[0])
-->
4B3C614E
-->
xxxx xxx1 0011 1100 0110 0001 0100 1110
float
通常是32位的,但语言没有这样定义它(我在使用64位
float
的系统上工作过)。我认为float应该遵循32位的IEEE 754单精度格式。我错了吗?它可以这样做,在大多数实现中都是这样,但其他表示是允许的。(几乎所有现代C实现都使用IEEE浮点。)