在《程序員面試寶典》有這樣一道題目:
#include <iostream> #include <string> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { float fa = 1.0f; cout<<&fa<<endl; //0x0012ff60 cout<<(int)fa<<endl; //1 cout<<(float&)fa<<endl;//1 cout<<*((float*)(&fa))<<endl;//1 cout<<(int&)fa<<endl;//1065353216 return 0; }
里面出現了一個很奇怪的輸出形式就是(int&)a.
其實,(int&)a就是*(int*)(&a)
- 首先對float型變量取地址
- 強制類型轉換為整型變量的地址(地址的值並沒有變)
- 將該地址指向的變量輸出(但是由於整型和浮點型數據存儲方式的不同,輸出結果是不同的)
下面說一下整型變量和浮點型變量的存儲區別:
下面以浮點數125.5為例來說明:
125二進制表示形式為1111101,小數部分表示為二進制為 1,則125.5二進制表示為1111101.1,由於規定尾數的整數部分恆為1,則表示為1.1111011*2^6,階碼為6,加上127為133,則表示為10000101,而對於尾數將整數部分1去掉,為1111011,在其后面補0使其位數達到23位,則為11110110000000000000000
則其二進制表示形式為
0 10000101 11110110000000000000000,則在內存中存放方式為:
- 00000000 低地址
- 00000000
- 11111011
- 01000010 高地址
-------------------------------------------------------------
對於將一個浮點型數據(double)賦值給整型數據(int)是怎樣截斷的?
float fa = 1.0f;
cout<<(int)fa<<endl;//1
所以只保留低位的數據