这些代码行:
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
答案 0 :(得分:4)
这是一个16位编译器吗?我的猜测是这是一个整数转换问题。你超过16位整数的大小,它被视为二进制补码。
因此,在您的示例中,您将计算结果转换为长 计算结果。假设g_sampleTimeInSeconds是带符号的16位int,那么
500 * 66 = 33000,大于有符号16位数允许的最大正值32767。这会导致溢出,中间值计算为33000 - 65536 = -32536。 -32536/60 = -542.xxx。
因此,您需要在表达式中强制转换值,或者将g_sampleTimeInSeconds的数据类型更改为long。