【问题标题】:Negative number printed after division with XC8 C compiler用 XC8 C 编译器除法后打印的负数
【发布时间】:2014-03-19 16:21:38
【问题描述】:

这些代码行:

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 位整数

【问题讨论】:

  • 请显示 g_sampleTimeInSecond 的数据类型
  • 更改为(500L*g_sampleTimeInSeconds) / 60;
  • @chux 你的方法也有效 - 似乎只有一个乘法操作数需要转换为 long 才能工作
  • 注:应加l:printf("Memory will fill up after %ld minutes\n", duration);

标签: c pic xc8


【解决方案1】:

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

因此,在您的示例中,您将计算结果转换为长时间的计算发生之后。假设 g_sampleTimeInSeconds 是有符号的 16 位 int,那么

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

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

【讨论】:

  • 这里是所有感兴趣的人的boring math
  • 我现在不在硬件前面,所以无法测试,但这很有意义。我没有意识到 g_sampleTimeInSeconds 的类型会影响其余的计算。完全测试后我会接受
猜你喜欢
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 2011-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多