程序員面試寶典學習筆記04

5.4類型轉換  面試題1

不要小瞧了這題,十分的有水平,作對很容易,能真正做明白這題的都不是一般人。

第十行不用多說,浮點型強制轉換爲整型,所以結果爲1

第十一行,輸出float類型變量a的地址,這個結果是不確定的,因爲每次編譯器編譯時都會爲變量分配不同緩存區的地址

第十二行,(int&)a什麼意思呢?對比int &a記憶。

                        int n = 1;  int &a=n;相當於給n這個變量的空間又取了一個名字,也稱之爲變量的引用,對於變量的引用我們要提防,因爲改變引用值a會使得n也改變。測試如圖。

再來看這樣一句語句 float a = 1.0f;b =(int&)a;首先我們定義了一個浮點型變量,併爲其初始化爲1.000000,然後我們將浮點型變量a的地址中存儲的數,從起始地址取前8*sizeof(int)個空間內的數強制轉換爲整型輸出。

爲了解釋清楚這個問題,我們首先要明白int型和float型變量在內存中是怎樣存儲的。C/C++用的是標準的IEEE模型,這個標準規定int型和float型在計算機中都佔4個字節(一個字節8 bit)。區別是int型以二進制形式存儲,而float型以指數形式存儲。

首先,整數型不必多說共32位二進制,第一位爲符號位,0表示正1表示負。剩下31位表示數字,所以int型的範圍爲-2147483648~2147483647

我們詳細來說明float型,float型在計算機系統中不論32還是64位系統都是4字節。它是通過採用指數形式存儲所以比int型可表示範圍更廣。如圖

1.第32位即最高位表示數據符號0表示正1表示負

2.第31-23位表示指數的2進制,共8位,可以表示0-255,但指數要有正負,所以標準IEEE規定,這裏的次方值才計算機存儲時,要減去127,纔是正真的存儲空間中存儲的數,這樣指數就能表示在-126~128.

3.第22-0,共23位。表示底數部分。底數部分實際是佔用24bit的值,因爲最高位始終爲1,所以省去不用佔據內存(只記錄移位後的小數部分),在內存中只存儲了23位。

舉個例子說明。將17.625換算成 float型。
1. 將17.625換算成二進制位:10001.101  ( 0.625 =1* 0.5+0.0.25+1*0.125, ) 

2. 將 10001.101 向右移,直到小數點前只剩一位 。爲1.0001101 x 2^4(因爲右移了4位)。此時 我們的底數M和指數E就出來了:
底數部分M,因爲小數點前必爲1,所以IEEE規定只記錄小數點後的就好,所以此處底數爲  0001101 。
指數部分E,實際爲4,但須加上127,固爲131,即二進制數 10000011 
符號部分S,由於是正數,所以S爲0.
綜上所述,17.625的 float 存儲格式就是:
0 10000011 00011010000000000000000(S E M)
轉換成16進制即內存中存放的數字:0x41 8D 00 00
對於本題,1.0f的內存存儲數據爲38 f0 00 00,以整形方式輸出就是1065353216

同理(int&)b=0因爲0.0在float型中存儲還是一堆0,所以第13和19輸出分別爲false true即0 1

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章