OpenEdv-开源电子网

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

关于C语言的强制类型转换,记录一下菜鸡的尝试

[复制链接]

10

主题

116

帖子

0

精华

高级会员

Rank: 4

积分
842
金钱
842
注册时间
2021-12-23
在线时间
202 小时
发表于 2023-5-25 15:56:51 | 显示全部楼层 |阅读模式
1金钱
在进行STM32的程序编写中,由于需要将一些实型数据储存到STM32的内存当中,实话实说我不会,于是将实型数据转换成无符号整型数据来进行储存,保留四位小数。
该实型数据是由无符号整型数据参与运算得到的
首先的想法是不进行数据类型强制转换,如下:
uint16_t a;
uint16_t b;
a=(100/b)*10000;   //(100/b)的值是1多一点
然后我将a值输出发现a=10000,我想不通,感觉是不是没加括号把整体放括号里的原因(根据C的运算规则加不加没影响,菜鸡遇到想不通的总想乱试试来排除),然后就给加了括号等式变成如下:
a=((100/b)*10000);   //(100/b)的值是1多一点
结果a输出还是a=10000,然后我就想是不是没进行类型强制转换,然后就把强制转换放整体前面,等式变成如下:
a=(uint16_t)((100/b)*10000);   //(100/b)的值是1多一点
结果a输出还是a=10000,然后我进行了断点调试一点点的看,最后发现(100/b)的小数部分是没有的,被舍掉了,然后又给b进行了强制转换,等式变换如下:
a=(uint16_t)((100/(float)b)*10000);   //(100/b)的值是1多一点
这下结果终于正常了。按我刚开始的理解,b应该自动转换为float类型(小范围自动转换为大范围类型),很明显我理解错了。哪如果a是float类型的b还需要强制转换为float类型的吗?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

800

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3775
金钱
3775
注册时间
2017-3-7
在线时间
1645 小时
发表于 2023-5-25 16:00:59 | 显示全部楼层
整性是向下取整,要精确不要用整性
回复

使用道具 举报

10

主题

116

帖子

0

精华

高级会员

Rank: 4

积分
842
金钱
842
注册时间
2021-12-23
在线时间
202 小时
 楼主| 发表于 2023-5-25 16:06:56 | 显示全部楼层
本帖最后由 苏九思 于 2023-5-25 16:08 编辑
a5820736 发表于 2023-5-25 16:00
整性是向下取整,要精确不要用整性

暂时并不在意精确性的问题,就是描述讨论一下关于C语言的强制类型转换和自动类型转换的问题
回复

使用道具 举报

10

主题

3281

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8206
金钱
8206
注册时间
2020-5-11
在线时间
3700 小时
发表于 2023-5-25 16:57:41 | 显示全部楼层
你的b明明是uint16_t类型,怎么值会是“1多一点”?
专治疑难杂症
回复

使用道具 举报

10

主题

116

帖子

0

精华

高级会员

Rank: 4

积分
842
金钱
842
注册时间
2021-12-23
在线时间
202 小时
 楼主| 发表于 2023-5-25 17:04:23 | 显示全部楼层
LcwSwust 发表于 2023-5-25 16:57
你的b明明是uint16_t类型,怎么值会是“1多一点”?

不好意思,我表达的不太清楚。我的意思是说如果用计算器算的话是1多一点,然后没有强制转换所以那个整体的值为1,以此来说明为什么输出的a=10000。
回复

使用道具 举报

10

主题

116

帖子

0

精华

高级会员

Rank: 4

积分
842
金钱
842
注册时间
2021-12-23
在线时间
202 小时
 楼主| 发表于 2023-5-25 17:06:57 | 显示全部楼层
LcwSwust 发表于 2023-5-25 16:57
你的b明明是uint16_t类型,怎么值会是“1多一点”?

本来想发成分享贴的,想想还是发成求助好一点,写的太烂了,第一次这样写,语言表达能力有待提升
回复

使用道具 举报

10

主题

3281

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8206
金钱
8206
注册时间
2020-5-11
在线时间
3700 小时
发表于 2023-5-25 17:12:12 | 显示全部楼层
本帖最后由 LcwSwust 于 2023-5-25 17:14 编辑
苏九思 发表于 2023-5-25 17:04
不好意思,我表达的不太清楚。我的意思是说如果用计算器算的话是1多一点,然后没有强制转换所以那个整体 ...

哦,是我看错了。
有个说法是“先乘后除”,避免精度丢失,因为中间的计算结果是与算式中的变量相同的类型。
a=(100/b)*10000;
改为
a=((long)100*10000/b);
为了性能考虑,尽量不用浮点。
专治疑难杂症
回复

使用道具 举报

10

主题

116

帖子

0

精华

高级会员

Rank: 4

积分
842
金钱
842
注册时间
2021-12-23
在线时间
202 小时
 楼主| 发表于 2023-5-26 08:37:56 来自手机 | 显示全部楼层
本帖最后由 苏九思 于 2023-5-26 09:38 编辑

“中间的计算结果是与算式中的变量相同的类型”这一句话把我整段说的废话全概括了,就是想表达这个意思,大佬还是大佬
以后遇到这种我尽量不用浮点型
回复

使用道具 举报

10

主题

116

帖子

0

精华

高级会员

Rank: 4

积分
842
金钱
842
注册时间
2021-12-23
在线时间
202 小时
 楼主| 发表于 2023-5-26 08:44:37 来自手机 | 显示全部楼层
本帖最后由 苏九思 于 2023-5-26 09:38 编辑

“中间的计算结果是与算式中的变量相同的类型”这一句话把我整段说的废话全概括了,就是想表达这个意思,大佬还是大佬
以后遇到这种我尽量不用浮点型
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 08:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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