C语言在数学计算过程中,超出数据范围怎么办?
例如u16 a;
u16 b = 61111;
u16 c = 111;
a = (b * c ) / 100;
b*c会超出u16的范围,/100会符合u16的范围内。该怎么显式转换才比较合适? 这个得分编译器,分情况。
以STM32为例,(b * c )的结果会自动转化为无符号32位数(uint32_t,或u32);
然后再除100;
得到的结果,再转化为16位数(u16),只保留最低16位。 用32位计算。 首先,学会用强制转换,其次,在使用前最好符合数据的规律,用大的uint32.。。。编译器一般是把16*16保存在一个临时的ram或者寄存器,然后处以100,也会用临时的ram或者寄存器,最后会赋值给a。。。但是,一切都有但是,不同的编译器采取的策略不一样,而且优化等级不一样,采取的策略也不一样。。。有时候你就会发现可以,有时候又不行。。。这里再谈呢就涉及到代码质量了,好的代码质量是不管怎么优化,或者不同的编译器,结果都是唯一确定的。。。 你可以引入一个中间变量x
uint32_t x;
x=b*c;
x/=100;
a=(uint16_t)x;
这样麻烦点,但是所有的向下转换都是显式的,这样比较安全点。 饱和运算了解下 进来学习学习 必須用32bit
toofree 发表于 2018-10-15 17:41
这个得分编译器,分情况。
以STM32为例,(b * c )的结果会自动转化为无符号32位数(uint32_t,或u32);
然 ...
明白 ,谢谢 stm1024 发表于 2018-10-16 08:28
你可以引入一个中间变量x
uint32_t x;
x=b*c;
长知识了,谢谢啦
页:
[1]