gcc:除零

use*_*687 5 c gcc-warning avr-gcc

我在这一行得到错误除法:

if (tim2_st_ovf < T2_PREK_250)
Run Code Online (Sandbox Code Playgroud)

这些值的定义如下:

volatile uint8_t tim2_st_ovf = 0;

#define T2_PREK_250    ((250 * (F_CPU / 1000)) / ((UINT8_MAX + 1) * 1024))
#define F_CPU    16000000UL
Run Code Online (Sandbox Code Playgroud)

UINT8_MAX等于255.

我为什么要这个?我在计算器上计算了好几次,得到了~15.此外,如果我将1024更改为1023它不会显示任何错误.

pts*_*pts 8

((UINT8_MAX + 1) * 1024)可能变为0,因为UINT8_MAX + 1通常是256,并且256 * 1024是0模2 16.所以,如果sizeof(int) == 2在你的建筑上,那么你得到0.

在GCC的典型现代桌面架构中sizeof(int) == 4,你不会得到0的除法.

要修复它,请替换10241024UL.这将有效,因为unsigned long保证最高可达4294967295.(感谢Pascal Cuoq解释它.)