- 问题:运动控制算法中存在uint64_t uint32_t int32_t float等数据的转换,由于自带强制转换造成数据变化,导致运动逆向旋转
- 解决思路:
- 基本类型:有符号与无符号的转换;长度不同的数据转换;
- static_cast 、const_cast、reinterpret_cast 、dynamic_cast 亦无法解决上述问题
- 参考链接:
C++有符号和无符号数的转换:https://www.cnblogs.com/LCCRNblog/p/5225065.html
四种类型转换运算符:http://c.biancheng.net/view/2343.html - 考虑使用数值的上限,如果上限没超过转换的上限,即可不用考虑
FLOAT/DOUBLE 快速转换INT的方法:
//
// 将64位浮点数转换为32位整数
// 小数部分将四舍五入到偶数
//
//用于double的magic number是1.5*2^52=6755399441055744.0
//对于double来说,相应的magic number就是1.5*2^36
inline int32_t f_toint(double x)
{
x += 6755399441055744.0;
return *(int32_t*)&x;
}
//四舍五入,处理的数据范围是-2^22 ~ 2^22-1, -4194304.0 ~ 4194303.0
inline int32_t f_toint32(float x)
{
//取得符号位,设置掩码
uint32_t n = ((*(uint32_t*)&x) & 0x80000000) ? 0xFFC00000 : 0;
x += 12582912.0f;
return ((*(uint32_t*)&x) & 0x3FFFFF) | n;
}
- magic number 怎么来的?!
- float、double格式在内存的存储?!
- f_toint32?!