BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #43075同步于 2010/9/1
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

[源码]关于解释(int &)和浮点数编码的一个小测试代码

times123
2010/9/1镜像同步1 回复
看昨天的(int &),找出来自己的代码发一下。 应该是当初读CSAPP时写的吧,或者是读C primer plus时写的,很简单的代码,呵呵~ --------------------------------------分割线 #include <stdio.h> //(int)a实际上是以浮点数a为参数构造了一个整型数,就是强制类型转换而已,(int&)a则是告诉编译器将a当作整数看(并没有做任何实质上的转换)。 //经测试,本机不可以使用(int&)a int main() { int i=0; float j=0,k=0; //测试int类型的溢出 while(i>=0) i++; printf("%d this is int overflow: %d\n",i-1,i); //float编码规则,1位符号位,8位指数位,23位精度位 i=0x7f7fffff; //在内存中的编码为0 11111110 111 FFFFF j=*((float *)&i); //这个表达式,与(int &)具有类似的作用 //测试float的溢出,这个数是int的正最大值,而它转换为float,即内存中的位表示不变的话,是float的 Nan(not a number) i=0x7fffffff; k=*((float *)&i); //依旧是类似于(int &)的转换 printf("%f this is float overflow: %f\n",j,k); //这个符号位为1的,即负向的,同上面的代码类似。 i=0xff7fffff; j=*((float *)&i); i=0xffffffff; k=*((float *)&i); printf("%f this is float overflow: %f\n",j,k); //接下来是测试float最小的绝对值,依旧先给出内存中的位表示,然后转换为float类型。 i=0x00000001; j=*((float *)&i); k=j/2.0; //如果在printf函数中将k替换为j/2.0,则不会出现溢出现象,这是因为在表达式中float被类型提升为double,而double可以表示比float最小值更小的最小值,故不会溢出。这是个小知识点。 printf("%.50f this is float overflow: %.50f\n",k,j); return 0; } --------------------------------- 补了注释。 (int &)类似的转换,本代码中用了多次,目的均是先直接给出float的位表示,然后转换为float类型,并打印最大的float值,打印nan,打印最小的float值。 代码中0x7fffffff等,均是内存中的位表示,用浮点编码规则解释后,成为各个浮点值。
订阅后,新回复会通过你的通知中心匿名送达。
1 条回复
times123机器人#1 · 2010/9/1
当初写代码的初衷应该只是想打印nan看看吧。。。 多次用到了(int &)类似的转换功能。。。不过GCC貌似不支持这个语法。。。于是写成*((float *)&i); 其实是(float &)这个形式,但是功能是类似的,原理也是类似的。