0

这些代码行:

long duration;
duration = (long)(500*g_sampleTimeInSeconds) / 60;
printf("Memory will fill up after %d minutes\n", duration);

当 g_sampleTimeInSeconds 大于 65 时会产生负数。当 g_sampleTimeInSeconds = 65 时,打印的数字是 541,但当它是 66 时,打印的数字是 -542 而不是正确的 550。当 g_sampleTimeInSeconds 替换为硬编码值。

此代码使用 XC8 编译器编译,可在 Microchip PIC 上运行

更新:

g_sampleTimeInSeconds 是一个 16 位整数

4

1 回答 1

4

这是 16 位编译器吗?我的猜测是这是一个整数转换问题。您超过了 16 位整数的大小,该整数被视为二进制补码。

因此,在您的示例中,在计算发生,您将计算结果转换为 long 。假设 g_sampleTimeInSeconds 是有符号的 16 位 int,则

500*66 = 33000,大于有符号 16 位数字所允许的最大正值 32767。这会导致溢出,中间值计算为 33000 - 65536 = -32536。-32536/60 = -542.xxx。

因此,您需要转换表达式中的值,或者将 g_sampleTimeInSeconds 的数据类型更改为 long。

于 2014-03-19T16:32:05.770 回答