做题的时候遇到的:
float a = 1.0f;
cout << (int)a << endl;
cout << &a << endl;
cout << (int&)a << endl;
cout << boolalpha << ( (int)a == (int&)a ) << endl; //输出什么?
float b = 0.0f;
cout << (int)b << endl;
cout << &b << endl;
cout << (int&)b << endl;
cout << boolalpha << ( (int)b == (int&)b ) << endl; //输出什么?
分析:
int&是一个引用类型,可以少产生一个临时对象,(int&)a的意思是将从a开始的内容解释为一个int型的引用,那么本题的关键就在于float的1、0和int的1、0在内存中的表示是否一样。
float类型的数据在计算机中占4字节,32位。将其由高到低位编号31~0,则31位为符号位,30~23位为指数位,22~0位为尾数位。
1.0f = 1.0*2^0 = 0 01111111 00000000000000000000000 = 0x3f800000
符号位0为正,代表正。
指数位为0的移码127,8位二进制可表示0-255的无符号整数,指数有正有负,因此加上127的移码。
尾数即1.0,由于采用科学计数法,第一位总是1,所以没必要保留,只要表示后面小数部分即可。
把3f800000当作int输出,结果应该是3f800000的十进制1065353216,不是1
而0.0f在内存中和0的布局一致都是全0
做题后记住一个结论吧:
float的1和int的1在内存中表示是不一样的,float的0和int的0在内存中表示是一样的