本帖最后由 WM_CH 于 2017-7-18 15:27 编辑
位域赋值问题.jpg (50 KB, 下载次数: 0)
下载附件
2017-7-18 15:18 上传
如图中的定义,和内存分布。
按说对位域赋值,只会影响位域变量 和 CHAR[0]
共同使用的内容,可是实验结果却是修改了CHAR[0]的
非共用内容!!
代码如下:
- tCAN.CHAR[0] = 0x58;
- printf("%#x
", tCAN.CHAR[0]);
- printf("%#x
", tCAN.BIT01);
- printf("%#x
", tCAN.BIT23);
-
- tCAN.BITbit01 = 0x01;
- printf("%#x
", tCAN.CHAR[0]);
- printf("%#x
", tCAN.BIT01);
- printf("%#x
", tCAN.BIT23);
复制代码
输出结果是
0x58
0
0x02
0x01
0x01
0
这里
红 {MOD}部分可以看出,影响了整个CHAR[0]字节!!!这个是绝不可能的啊!这什么情况。。。
MDK里面用了一个关键字#pragma anon_union来使用匿名联合(如图中),这个会影响赋值操作?我只是瞎猜。。。
同样的做法,在电脑端用VS2010测试结果是
0x58
0
0x02
0x59
0x01
0x02
这里
蓝 {MOD}部分可以看出,这才是正确的结果啊。。。
第一个是大小端问题,即BITbit01和CHAR[x]形成联合体,x到底是0还是7
第二个是BITbit01和BIT01是完全等价的, 与CHAR[0]的哪2位是等价的?【这个是我没搞清楚,编译器也没搞清楚,导致的楼主的问题出现】
正确办法是,对一个没有用到的空位域,要写明,把整个字节填充满。
所以经过实验,加了个空位域进去填充满字节,输出结果是正确的了。
位域赋值问题.jpg (39.59 KB, 下载次数: 0)
下载附件
2017-7-18 16:37 上传
结贴、
一周热门 更多>