你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

C语言在数学计算过程中,超出数据范围怎么办?

[复制链接]
bobo4869 提问时间:2018-10-15 14:39 /
例如
u16 a;
u16 b = 61111;
u16 c = 111;

a = (b * c ) / 100;
b*c会超出u16的范围,/100会符合u16的范围内。  该怎么显式转换才比较合适?
收藏 评论9 发布时间:2018-10-15 14:39

举报

9个回答
七哥 回答时间:2018-10-15 17:41:43
这个得分编译器,分情况。
以STM32为例,(b * c )的结果会自动转化为无符号32位数(uint32_t,或u32);
然后再除100;
得到的结果,再转化为16位数(u16),只保留最低16位。

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

废鱼 回答时间:2018-10-15 15:01:24
用32位计算。

评分

参与人数 1蝴蝶豆 +1 收起 理由
STMCU + 1

查看全部评分

MrJiu 回答时间:2018-10-15 15:43:32
首先,学会用强制转换,其次,在使用前最好符合数据的规律,用大的uint32.。。。编译器一般是把16*16保存在一个临时的ram或者寄存器,然后处以100,也会用临时的ram或者寄存器,最后会赋值给a。。。但是,一切都有但是,不同的编译器采取的策略不一样,而且优化等级不一样,采取的策略也不一样。。。有时候你就会发现可以,有时候又不行。。。这里再谈呢就涉及到代码质量了,好的代码质量是不管怎么优化,或者不同的编译器,结果都是唯一确定的。。。

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

STM1024 回答时间:2018-10-16 08:28:08
你可以引入一个中间变量x
uint32_t x;
x=b*c;
x/=100;
a=(uint16_t)x;
这样麻烦点,但是所有的向下转换都是显式的,这样比较安全点。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

一木320 回答时间:2018-10-16 10:23:43
饱和运算了解下

评分

参与人数 1蝴蝶豆 +1 收起 理由
STMCU + 1

查看全部评分

schlechte62dbb 回答时间:2018-10-27 17:21:29
进来学习学习
namestanly 回答时间:2018-10-31 09:41:38
必須用32bit

评分

参与人数 1蝴蝶豆 +1 收起 理由
STMCU + 1

查看全部评分

bobo4869 回答时间:2018-11-19 09:40:08
toofree 发表于 2018-10-15 17:41
这个得分编译器,分情况。
以STM32为例,(b * c )的结果会自动转化为无符号32位数(uint32_t,或u32);
然 ...

明白 ,谢谢
bobo4869 回答时间:2018-11-19 09:40:24
stm1024 发表于 2018-10-16 08:28
你可以引入一个中间变量x
uint32_t x;
x=b*c;

长知识了,谢谢啦

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版