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