我在这一行收到被零除错误:
if (tim2_st_ovf < T2_PREK_250)
这些值定义如下:
volatile uint8_t tim2_st_ovf = 0;
#define T2_PREK_250 ((250 * (F_CPU / 1000)) / ((UINT8_MAX + 1) * 1024))
#define F_CPU 16000000UL
UINT8_MAX
等于 255。
为什么我会收到这个?我在计算器上计算了几次,结果是 ~15。此外,如果我将 1024 更改为 1023,它不会显示任何错误。
最佳答案
((UINT8_MAX + 1) * 1024)
可能会变成0,因为UINT8_MAX + 1
通常是256,而256 * 1024
是0 模 216。因此,如果 sizeof(int) == 2
在您的架构中,那么您将得到 0。
在带有 GCC 的典型现代桌面架构上,sizeof(int) == 4
,您不会得到除以 0。
要修复它,请将 1024
替换为 1024UL
。这行得通,因为 unsigned long
保证达到 4294967295。(感谢 Pascal Cuoq 的解释。)
关于c - 海合会 : division by zero,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25702098/