热门标签 | HotTags
当前位置:  开发笔记 > 开发工具 > 正文

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

如何解决《在任何C编译器和计算机上,0/0(NAN)和1/0(INF)的字节表示形式是否相同?》经验,为你挑选了1个好方法。

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

// this is no code, just IEEE-754 math
n = 0 / 0
i = 1 / 0

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

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;
}

像这样启动程序:

./a.out 0

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

fff8000000000000
7ff0000000000000

现在我想知道的是:

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



1> Ayxan..:

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

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


推荐阅读
author-avatar
键盘上的泪g_752
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有