繁体   English   中英

gcc:除零

[英]gcc: division by zero

我在这一行得到错误除法

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模2 16 因此,如果你的achitecture上的sizeof(int) == 2 ,那么你得到0。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM