单片机为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。

原文地址:https://www.cnblogs.com/praiseslow/p/10979866.html