bobo4869 发表于 2018-10-15 14:39:57

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

例如
u16 a;
u16 b = 61111;
u16 c = 111;

a = (b * c ) / 100;
b*c会超出u16的范围,/100会符合u16的范围内。该怎么显式转换才比较合适?

toofree 发表于 2018-10-15 17:41:43

这个得分编译器,分情况。
以STM32为例,(b * c )的结果会自动转化为无符号32位数(uint32_t,或u32);
然后再除100;
得到的结果,再转化为16位数(u16),只保留最低16位。

发表于 2018-10-15 15:01:24

用32位计算。

MrJiu 发表于 2018-10-15 15:43:32

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

stm1024 发表于 2018-10-16 08:28:08

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

一木320 发表于 2018-10-16 10:23:43

饱和运算了解下

schlechte62dbb 发表于 2018-10-27 17:21:29

进来学习学习

namestanly 发表于 2018-10-31 09:41:38

必須用32bit

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;


长知识了,谢谢啦
页: [1]
查看完整版本: C语言在数学计算过程中,超出数据范围怎么办?