我使用此Map函数将0-1023之间的值Map到0-255之间的值
函数mapping_function
将16位无符号整数值作为输入,以Map到0-255
函数声明如下
uint16_t mapping_function(uint16_t x)
{
return (x*255)/1023;
}
问题是,它不是这样工作的。Map的值不正确,并导致意外的结果值(函数返回)
只有当我像下面这样声明它时它才能工作:
uint16_t mapping_function(uint16_t x)
{
return (x*255UL)/1023;
}
在第一个常量后使用UL“unsigned long”字面值。
或
将x变量定义为float,如下所示:
uint16_t mapping_function(float x)
{
return (x*255)/1023;
}
我怀疑这是由于溢出问题发生的,但我不明白为什么?我感谢任何帮助。谢谢:D
1条答案
按热度按时间vfhzx4xs1#
采用16位
int/unsigned
时:溢出。一个一个一个二个一个 * 一个三个一个。
16-位
int/unsigned
:数学乘积是unsigned
,并且具有足够大的x
,由于溢出而被截断。32-位
int/unsigned
:int
中的产品,与所有x
的预期一致。是一个一个一个一个一个一个一个
32-位
long/unsigned long
:unsigned long
中的产品,与所有x
的预期一致。64-位
long/unsigned long
:unsigned long
中的产品,与所有x
的预期一致。与其使用
L
,L
可能过宽或没有L
,常数也可能过窄,并且由于乘积可能比16位宽,对于int/unsigned
可能是16、32、...的所有系统的可移植代码,使用UINTN_C(value)
。它形成一个最小宽度常数,并执行至少32位无符号算术乘法。
我也怀疑OP的Map是不是最好的。
考虑: