c - 海合会 : division by zero

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

最佳答案

((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/

相关文章:

python - ctypes 和 c dll 之间交换数据的正确方法是什么?

c++ - 如果 C++ 共享库在 C 项目中抛出异常会发生什么

c - 删除字符串 C 的第一个字符

c++ - 禁用不兼容选项的 gcc 警告

c - AVR C 中的位和字节解释

c - 如果 Realloc() 失败,调用者是否会丢失前一个 malloc() 调用中的数据?

从 uint16_t 转换并转换为 int16_t

c++ - <内置> :1:2: warning: use of C++0x long long integer constant [-Wlong-long]

c - 嵌入式系统上中断密集型代码的单元测试

c++ - GCC编译器错误: -Werror=stringop-truncation: no option