我目前正在编写一个arduino并且正在使用C ++对象来执行此操作。当我尝试乘以指向的值时,我遇到了一个奇怪的问题。参考下面的代码,当我运行程序时,var3和var4最终有两个不同的值。为什么是这样?它们基本上是相同的值(或者我相信)。有什么帮助吗?
long var1 = info->accelXYZ[0];
long var2 = info->taughtAccelXYZ[0];
long var3 = var1*var2;
long var4 = info->accelXYZ[0]*info->taughtAccelXYZ[0];
答案 0 :(得分:1)
在某种情况下,你可能会溢出。
var1
和var2
(两个long
)的乘法得到long
,然后将其加载到var3
。
如果info->accelXYZ[0]
和info->taughtAccelXYZ[0]
都是int
(例如),则乘法结果将为int
,然后将其加载到long
中间int
表单可能会溢出,您可以在以下代码段中看到:
#include <stdio.h>
#include <limits.h>
int main(void) {
printf("int has %d bytes\n",sizeof(int));
printf("long has %d bytes\n",sizeof(long));
int a = INT_MAX;
int b = 2;
long var1 = a;
long var2 = b;
long var3 = a * b;
long var4 = var1 * var2;
printf ("var3=%ld\n", var3);
printf ("var4=%ld\n", var4);
return 0;
}
输出:
int has 4 bytes
long has 8 bytes
var3=-2
var4=4294967294
答案 1 :(得分:0)
var3
最终可能与var4
不同的一个原因是整数溢出。当两个被乘数都适合int
时,会发生这种情况,但产品不适合。
由于int
和long
在Arduino Uno * 上的大小不同,var3
的计算与var4
的计算不同
当您计算var3
时,乘法在long
s中对适合int
的初始值进行,因此乘法的结果不会被转换。计算var4
时,计算在int
中完成,然后提升为long
。但是,到那时结果已被截断,这导致您观察到的差异。
要使var4
与var3
具有相同的正确值,请将long
的强制转换添加到其中一个被乘数中,如下所示:
long var4 = (info->accelXYZ[0])*((long)info->taughtAccelXYZ[0]);
* int
有16位,而long
有32位。