作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在调试用 C 编写的生产代码,其最简单的形式可以显示为 -
void
test_fun(int sr)
{
int hr = 0;
#define ME 65535
#define SE 256
sr = sr/SE; <-- This should yield 0
if(sr == 1)
hr = ME;
else
hr = (ME+1)/sr; <-- We should crash here.
}
我们将 sr
作为 128 传递,理想情况下应该在处理器中产生被零除错误。我看到这个除法成功地发生了,商为 0x7ffffffff(hr
是这个值)。当我使用 gcc 在 Intel 平台上编译和运行时,这不会发生(尝试除以零时会崩溃)。
想知道这个大商背后的原理。不确定这是否只是我仍然需要发现的其他错误。有人可以帮我开发另一个具有相同功能的程序吗?
最佳答案
除以零是 undefined behaviour , 请参阅 C11 standard 6.5.5#5 (最终草案)。
获取陷阱或 SIGFPE 只是 CPU/OS 的礼貌。 PowerPC 作为典型的 RISC CPU 不会捕获它,因为它可以通过在进行实际除法之前对除数进行简单检查来安全地检测到。 x86 OTOH 确实捕捉到这个 - 典型的 CISC 行为。
如果更高层标准要求,您可能错过了自动发出此检查的编译器选项。例如,POSIX 不强制执行 SIGFPE,这是可选的。
关于c - 32 位有符号整数除法在 PowerPC 上给出 0x7fffffff 作为商,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30695786/
我需要这样的日期格式:yyyy-MM-dd_HH.mm.ss.fffffff 我试过这个: var currentdate = new Date(); var fileName = currentda
我是一名优秀的程序员,十分优秀!