C ++指针取消引用乘法

时间:2015-07-20 01:51:04

标签: c++ arduino

我目前正在编写一个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];

2 个答案:

答案 0 :(得分:1)

在某种情况下,你可能会溢出。

var1var2(两个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时,会发生这种情况,但产品不适合。

由于intlong在Arduino Uno * 上的大小不同,var3的计算与var4的计算不同

当您计算var3时,乘法在long s中对适合int的初始值进行,因此乘法的结果不会被转换。计算var4时,计算在int中完成,然后提升为long。但是,到那时结果已被截断,这导致您观察到的差异。

要使var4var3具有相同的正确值,请将long的强制转换添加到其中一个被乘数中,如下所示:

long var4 = (info->accelXYZ[0])*((long)info->taughtAccelXYZ[0]);

* int有16位,而long有32位。