OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2751|回复: 4

在时钟配置函数中 有个(uint32_t)((uint32_t)~R)语法问题没弄懂 请大神指教!!!!

[复制链接]

3

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2019-3-19
在线时间
19 小时
发表于 2019-4-4 20:16:19 | 显示全部楼层 |阅读模式
7金钱
在时钟配置中有一个配置系统频率为72MHz的函数SetSysClockTo72其中选择PLL为系统时钟的语句    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));//这一句是初始化 RCC->CFGR的SW位,那么为什么要用两次的强制类型转换
(uint32_t)((uint32_t)~(RCC_CFGR_SW)),PS:已知  RCC_CFGR_SW  为uint32_t类型的数据   为什么在取反后强制转换为uint32_t后   有来了一次强制转换(uint32_t)
是我读句子读错了  还是怎么回事  求大神解答!!  
感激不尽!!!

最佳答案

查看完整内容[请看2#楼]

因为常数是不带类型, 比如 #define abc 3, 编译器不知道这个1是u8, u16 还是u32 在一般应用时这不会是个问题, 但当你企图取反的话就会有问题 (uint8)~abc 的取反是 _1111_1100 (uint16)~abc 的取反是 _1111_1111_1111_1100 (uint32)~abc 的取反是 _1111_1111_1111_1111_1111_1111_1111_1100 给一个32位寄存器 XYZ &= (uint8)~abc == XYZ &= _0000_0000_0000_0000_0000_0000_1111_1100 这显然不是你想要 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2019-4-4 20:16:20 | 显示全部楼层
因为常数是不带类型, 比如 #define abc 3, 编译器不知道这个1是u8, u16 还是u32
在一般应用时这不会是个问题, 但当你企图取反的话就会有问题

(uint8)~abc    的取反是  _1111_1100
(uint16)~abc 的取反是  _1111_1111_1111_1100
(uint32)~abc 的取反是  _1111_1111_1111_1111_1111_1111_1111_1100

给一个32位寄存器   XYZ &= (uint8)~abc   ==   XYZ &= _0000_0000_0000_0000_0000_0000_1111_1100
这显然不是你想要的结果, 所以取反常量时要给它定义为目标的相同类型。
回复

使用道具 举报

3

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2019-3-19
在线时间
19 小时
 楼主| 发表于 2019-4-5 15:30:38 | 显示全部楼层
edmund1234 发表于 2019-4-4 20:41
因为常数是不带类型, 比如 #define abc 3, 编译器不知道这个1是u8, u16 还是u32
在一般应用时这不会是 ...

哥哥   那为什么在给定格式为uint32_t取反之后又一次强制转换为uint32_t了呢
(uint32_t)((uint32_t)~(RCC_CFGR_SW))
**********
PS:打星号的地方是我不太懂得   是为了防止错误么才加的一层保险么
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2019-4-5 15:43:13 | 显示全部楼层
驯龙炮手尹志平 发表于 2019-4-5 15:30
哥哥   那为什么在给定格式为uint32_t取反之后又一次强制转换为uint32_t了呢
(uint32_t)((uint32_t)~(R ...

在这一句当中最前面的(unit32_t)是没需要的, 只是加了也不会报错, 好比
int a=10;
int b;

b=(int)a;是不会报错, 但这个(int)是多余的, 甚至你写成
b=(int)((int)a);  这个也不会报错

回复

使用道具 举报

3

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2019-3-19
在线时间
19 小时
 楼主| 发表于 2019-4-5 21:37:34 | 显示全部楼层
edmund1234 发表于 2019-4-5 15:43
在这一句当中最前面的(unit32_t)是没需要的, 只是加了也不会报错, 好比
int a=10;
int b;

谢谢哥哥  
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-23 06:09

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表