stm32f103的位域赋值,却影响了整个字节。。大家帮忙看一下

2019-12-26 18:55发布

本帖最后由 WM_CH 于 2017-7-18 15:27 编辑

位域赋值问题.jpg (50 KB, 下载次数: 0) 下载附件 2017-7-18 15:18 上传

如图中的定义,和内存分布。
按说对位域赋值,只会影响位域变量 和 CHAR[0] 共同使用的内容,可是实验结果却是修改了CHAR[0]的非共用内容!!
代码如下:
  1.     tCAN.CHAR[0] = 0x58;
  2.     printf("%#x ", tCAN.CHAR[0]);
  3.     printf("%#x ", tCAN.BIT01);
  4.     printf("%#x ", tCAN.BIT23);
  5.    
  6.     tCAN.BITbit01 = 0x01;
  7.     printf("%#x ", tCAN.CHAR[0]);
  8.     printf("%#x ", tCAN.BIT01);
  9.     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}部分可以看出,这才是正确的结果啊。。。







友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
24条回答
t3486784401
1楼-- · 2019-12-26 22:53
 精彩回答 2  元偷偷看……
WM_CH
2楼-- · 2019-12-27 04:22
t3486784401 发表于 2017-7-18 15:30
CHAR 和后边的位域,共处于一个 union 当中,很显然 CHAR[0] 要和位变量共用内存区了,互相影响不应该是正 ...

我的意思是说,修改位域那个变量,只会修改CHAR[0]所在的字节中,和位域变量共用的几个bit,
而不应该修改不共用的bit。

如题中,BITbit01只占CHAR[0]最低的两个bit,
赋值BITbit01 = 0x01,【CHAR[0] = 0x58】
那么CHAR[0] 应该等于 0x59
而不是CHAR[0] 也变成了 0x01




snoopyzz
3楼-- · 2019-12-27 07:35
本帖最后由 snoopyzz 于 2017-7-18 15:57 编辑

楼主你自己用了union!!

自然是共用了, union里每个成员都是共用的, 你这样定义后BITbit01和BIT01是完全等价的, 与CHAR[0]的低2位也等价

你这别说stm32, 随便放哪个C编译器也是一样的结果, 你自以为是的结果反而是错的
WM_CH
4楼-- · 2019-12-27 12:23
这里有两个概念比较模糊,
第一个是大小端问题,即BITbit01和CHAR[x]形成联合体,x到底是0还是7
第二个是BITbit01和BIT01是完全等价的, 与CHAR[0]的哪2位是等价的?【这个是我没搞清楚,编译器也没搞清楚,导致的楼主的问题出现】
正确办法是,对一个没有用到的空位域,要写明,把整个字节填充满。

所以经过实验,加了个空位域进去填充满字节,输出结果是正确的了。

位域赋值问题.jpg (39.59 KB, 下载次数: 0)

下载附件

2017-7-18 16:37 上传






结贴、
huangqi412
5楼-- · 2019-12-27 15:59
WM_CH 发表于 2017-7-18 16:37
这里有两个概念比较模糊,
第一个是大小端问题,即BITbit01和CHAR[x]形成联合体,x到底是0还是7
第二个是BI ...

位域  不跟八位对齐本来就是会纠结死人的  就是普通结构体成员不对齐也会憋死强迫症  要调换成员顺序甚至显性添加空字节对齐2/4
WM_CH
6楼-- · 2019-12-27 20:03
 精彩回答 2  元偷偷看……

一周热门 更多>