返回信息流看昨天的(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等,均是内存中的位表示,用浮点编码规则解释后,成为各个浮点值。
这是一条镜像帖。来源:北邮人论坛 / cpp / #43075同步于 2010/9/1
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
[源码]关于解释(int &)和浮点数编码的一个小测试代码
times123
2010/9/1镜像同步1 回复
订阅后,新回复会通过你的通知中心匿名送达。
1 条回复
当初写代码的初衷应该只是想打印nan看看吧。。。
多次用到了(int &)类似的转换功能。。。不过GCC貌似不支持这个语法。。。于是写成*((float *)&i); 其实是(float &)这个形式,但是功能是类似的,原理也是类似的。