C++: 类型转换如何更改数据


  • 问题:运动控制算法中存在uint64_t uint32_t int32_t float等数据的转换,由于自带强制转换造成数据变化,导致运动逆向旋转
  • 解决思路:
  1. 基本类型:有符号与无符号的转换;长度不同的数据转换;
  2. static_cast 、const_cast、reinterpret_cast 、dynamic_cast 亦无法解决上述问题
  3. 参考链接:
    C++有符号和无符号数的转换:https://www.cnblogs.com/LCCRNblog/p/5225065.html
    四种类型转换运算符:http://c.biancheng.net/view/2343.html
  4. 考虑使用数值的上限,如果上限没超过转换的上限,即可不用考虑

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?!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值