gcc:除零

时间:2014-09-06 16:05:13

标签: c gcc-warning avr-gcc

我在这一行得到除以零错误:

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,则不会显示任何错误。

1 个答案:

答案 0 :(得分:7)

((UINT8_MAX + 1) * 1024)可能会变为0,因为UINT8_MAX + 1通常为256,256 * 1024为0模2 16 。因此,如果你的架构上有sizeof(int) == 2,那么你得到0。

在GCC的典型现代桌面架构sizeof(int) == 4上,你不会将除法除以0。

要解决此问题,请将1024替换为1024UL。这将有效,因为unsigned long保证最高可达4294967295.(感谢Pascal Cuoq解释它。)