- C/C++ code
#include <stdio.h> #include <stdlib.h> int main(void) { union { int i; struct { char first; char second; }sql_l; }number; number.i=0x4445; printf("%c%c%x\n",number.sql_l.first,number.sql_l.second,number.i); number.sql_l.first='c'; number.sql_l.second='d'; printf("%x\n",number.i); system("pause"); return 0; }
程序的输出结果为:
ED4445
6463
从上面的结果可以看出:当给i赋值后,其低八位是first的值,而高八位是second的值,
当给first和second赋字符后,i的值也跟随发生变化。
===================================================
上面是书上的一个例题,我不明白他说的这句话"其低八位是first的值,而高八位是second的值"什么是低八位?什么是高八位?该怎么判断它是低八位还是高八位呢?去百度查,不知这是属于那方面的知识,新人不解,请详解!
------解决方案--------------------
这个问题跟union的存储方式有关
union在存储的时候,在内存中开辟的是union中最长类型的字节数,所有的成员共用这个空间
这个例子里,union在内存中开辟的是一个int类型的空间(一般是4字节),sql_l与i共用这个4字节的空间,但是由于sql_l只占用2个字节,
所以sql_l的成员first占用低8位(就是Byte0),second占用高8位(就是Byte1);
union只存储最新的成员的值,所以修改某个成员的时候,会导致其他成员的值变化
------解决方案--------------------
0x4455 二进制形式-->0100 0100 0100 0101
从右往左数是从第0位到第15位,红的是高八位,蓝的是低八位
------解决方案--------------------
在struct
{
char first;
char second;
}sql_l;
中,first在second的前面,所以first占低8位了,second占高8位了。
------解决方案--------------------