• 单片机为32bit时运算中64bit运算中遇到的bug及其规避手段


    在单片机运算中。一般只能处理32bit的运算。在有些场合,不得不处理64bit的运算的时候。
    发现编译器也是支持的。编译器应该是通过软件实现的。

    设想一种场合,要对一个32bit的数进行乘以0xffffffff的操作。

    方式1:
    //先定义一个 numTmp_64bit
    numTmp_64bit = numA_32bit*0xff;
    numTmp_64bit *= 0xffffff;
    
    方式2:
    //先定义一个 numTmp_64bit
    numTmp_64bit = numA_32bit*0xffff;
    numTmp_64bit *= 0xffff;
    
    方式3:
    //先定义一个 numTmp_64bit
    numTmp_64bit = numA_32bit*0xffffff;
    numTmp_64bit *= 0xff;
    
    方式4:
    //先定义一个 numTmp_64bit
    numTmp_64bit = numA_32bit;
    numTmp_64bit *= 0xffffffff;
    

    通过实测发现,方式1、方式2和方式3均存在不同程度的错误,准确度丢失等问题。

    只有方式4正常,是一种对运算过程中出现的莫名其妙的错误的一种规避手段。以上讨论对于有符号无符号均适用。

    测试环境:32bit的powerpc单片机,编译器为gcc或者dcc。

  • 相关阅读:
    tyvj[1087]sumsets
    tyvj[1089]smrtfun
    [bzoj3289]Mato的文件管理
    luogu[2093]零件分组
    luogu[1135]奇怪的电梯
    codevs[1300]文件排版
    luogu[1140]相似基因
    动态规划练习题 胖男孩
    动态规划练习题 汇率
    vijos[1355]车队过桥问题
  • 原文地址:https://www.cnblogs.com/praiseslow/p/10979866.html
Copyright © 2020-2023  润新知