据我了解,你可以得到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不能依靠那些产生上述结果的部门吗?
0 / 0和1 / 0是整数除法,导致不确定的行为,因此不提供任何保证。
C11 6.5.5p5-/运算符的结果是第一个操作数除以第二个操作数所得的商;%运算符的结果是余数。在这两个操作中,如果第二个操作数的值为零,则行为是不确定的。