union是大家比较熟悉的一个数据类型,假设有:
union Ut
{
short sh;
char ch;
};
假设有如下执行代码:
void main()
{
Ut t; // 1
t.sh = 0x1000; // 2
t.ch = 0x01; // 3
}
如果是小端机器上,那么 代码执行完代码 2 处,t 对象的 变量的内存为:00 10,图示1如下
执行完代码 3 处后, t 对象的内存为图2所示:
t.ch = 0x01 ,就是红色的 01, 仅覆盖了原有的 00
内存却不是:01 00,(t.ch只能够操作一个字节的空间)
总结:一直以为,union的确是按最大的成员变量来开辟内存空间,但是只存放一个成员的值,以该程序为例,执行 t.sh = 0x1000;内存如图1所示。
但是执行 t.ch = 0x01后,以前的理解是会将内存先清空,再保存 t.ch的值,该是 01 00,但实际却是图2所示的 01 10 ,执行完代码3处,t.ch只是改变自己的一个字节,内存中的其他位置不作处理,只是保存自己的一个字节 01,后面的 10未操作。
本文深入探讨了Union数据类型的特性及其实现原理。通过具体的代码示例,解释了在小端机器上Union如何处理不同大小的数据成员,特别是当短整型和字符型变量共用同一段内存时的行为。
1151

被折叠的 条评论
为什么被折叠?



