在任何C编译器和计算机上,0/0(NAN)和1/0(INF)的字节表示形式是否相同?

And*_*eas 0 c math

据我了解,你可以得到NaN,并Inf通过这样做:

// this is no code, just IEEE-754 math
n = 0 / 0
i = 1 / 0
Run Code Online (Sandbox Code Playgroud)

现在,您可以像下面这样检查两个变量的字节表示形式:

void dumpdouble(double x) {
    unsigned char *p = (unsigned char *) &x;
    int k;
#ifndef BIG_ENDIAN
     for(k = 0; k < 8; k++) printf("%.2x", p[7-k]);
#else    
     for(k = 0; k < 8; k++) printf("%.2x", p[k]);
#endif 
    printf("\n");
}

int main(int argc, char *argv[]) {
    double n = (double) 0 / (double) atoi(argv[1]);
    double i = (double) 1 / (double) atoi(argv[1]);     
    dumpdouble(n);
    dumpdouble(i);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

像这样启动程序:

./a.out 0
Run Code Online (Sandbox Code Playgroud)

在带有Visual C 15 x64的Windows 7上,结果是这样的:

fff8000000000000
7ff0000000000000
Run Code Online (Sandbox Code Playgroud)

现在我想知道的是:

使用任何$fff8000000000000保证$7ff0000000000000符合IEEE-754标准的C编译器和体系结构,使用64位双精度的0/0是否保证传递,使用64位双精度的1/0是否保证在任何符合IEEE-754的C编译器和体系结构上传递,或者是特定于机器/编译器/任何东西的I不能依靠那些产生上述结果的部门吗?

Ayx*_*xan 8

0 / 01 / 0是整数除法,导致不确定的行为,因此不提供任何保证。

C11 6.5.5p5-/运算符的结果是第一个操作数除以第二个操作数所得的商;%运算符的结果是余数。在这两个操作中,如果第二个操作数的值为零,则行为是不确定的。