![](/img/trans.png)
[英]Why integer division by zero doesn't crash the program compiled with 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.