使用XC8 C编译器分割后打印的负数

时间:2014-03-19 16:21:39

标签: c pic xc8

这些代码行:

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位的int

1 个答案:

答案 0 :(得分:4)

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

因此,在您的示例中,您将计算结果转换为长 计算结果。假设g_sampleTimeInSeconds是带符号的16位int,那么

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

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