C 为什么这段代码会导致浮点异常-SIGFPE

C 为什么这段代码会导致浮点异常-SIGFPE,c,exception,compiler-optimization,gcc4,C,Exception,Compiler Optimization,Gcc4,使用gcc 4.7: $ gcc --version gcc (GCC) 4.7.0 20120505 (prerelease) 代码清单(test.c): SIGFPE是由第二个赋值(y=…)引起的。在汇编列表中,这一行有一个除法?请注意,x=和y=之间的唯一区别是强制转换到(uintpttr_t)。忽略由于违反标准中的常量而导致的未定义行为,gcc在这里所做的是计算指向char[0]-和((结构测试*)0)->start和&((结构测试*)0)->end),然后用一个char[0]的大小除

使用gcc 4.7:

$ gcc --version
gcc (GCC) 4.7.0 20120505 (prerelease)
代码清单(test.c):


SIGFPE是由第二个赋值(y=…)引起的。在汇编列表中,这一行有一个除法?请注意,x=和y=之间的唯一区别是强制转换到(uintpttr_t)。

忽略由于违反标准中的常量而导致的未定义行为,gcc在这里所做的是计算指向
char[0]
-
和((结构测试*)0)->start
&((结构测试*)0)->end)
,然后用一个
char[0]
的大小除以这个差值,当然是0,所以你得到一个除以0的除法。

GCC浏览器输出:
char start[0]表示您不在标准定义的区域内。除此之外发生了什么,它真的很有趣吗?由于历史原因,在UNIX中,整数除以
0
会产生一个浮点异常(SIGFPE信号),这是UNIX(及其衍生物)的特性吗?我认为这是一个x86的东西。好问题,我知道UNIX上的x86是这样的,但我不确定其他系统是否也是这样。如果有人肯定知道,也请ping@ouah。我很想确定。在Linux armv6l上测试了整数除以
0
,它也给出了一个浮点异常。
#include <stdint.h>

struct test {
    int before;

    char start[0];
    unsigned int v1;
    unsigned int v2;
    unsigned int v3;
    char end[0];

    int after;
};

int main(int argc, char **argv)
{
  int x, y;

  x = ((uintptr_t)(&((struct test*)0)->end)) - ((uintptr_t)(&((struct test*)0)->start));
  y = ((&((struct test*)0)->end)) - ((&((struct test*)0)->start));

  return x + y;
}
$ gcc -Wall -o test test.c && ./test
Floating point exception