公司應(yīng)聘考試題目分享:(int&)a 與 (int)&a 的區(qū)別在哪里
#include
int main()
{
float a = 1.0f;
cout << sizeof(int)<<endl;//4
cout << sizeof(float)<<endl;//4
cout << (int)a<< endl;//1
cout << &a<< endl;
cout << (int)&a<< endl;
cout << (int&)a<< endl;
????
cout << boolalpha<< ((int)a == (int&)a) <<endl;//??輸出false.因?yàn)?!=1065353216.
float b = 0.0f;
cout << (int)b<< endl;//0
cout << &b<< endl;
cout << (int&)b<< endl;//0
cout << boolalpha<< ((int)b == (int&)b) <<endl;//?? 輸出true,因?yàn)?==0;
return 0;
}
========================c語(yǔ)言中FLOAT是如何表示的===========================
c語(yǔ)言中FLOAT 是如何表示的?尾數(shù),階碼是如何在32位上安排的,即哪幾位是尾數(shù),哪幾位是階碼,那一位是符號(hào)位。聽(tīng)說(shuō)與CPU有關(guān),是真的嗎?
???在C++里,實(shí)數(shù)(float)是用四個(gè)字節(jié)即三十二位二進(jìn)制位來(lái)存儲(chǔ)的。其中有1位符號(hào)位,8位指數(shù)位和23位有效數(shù)字位。實(shí)際上有效數(shù)字位是24位,因?yàn)榈谝晃挥行?shù)字總是“1”,不必存儲(chǔ)。
???有效數(shù)字位是一個(gè)二進(jìn)制純小數(shù)。8位指數(shù)位中第一位是符號(hào)位,這符號(hào)位和一般的符號(hào)位不同,它用“1”代表正,用”0“代表負(fù)。整個(gè)實(shí)數(shù)的符號(hào)位用“1”代表負(fù),“0”代表正。
???在這存儲(chǔ)實(shí)數(shù)的四個(gè)字節(jié)中,將最高地址字節(jié)的最高位編號(hào)為31,最低地址字節(jié)的最低位編號(hào)為0,則實(shí)數(shù)各個(gè)部分在這32個(gè)二進(jìn)制位中的分布是這樣的:31位是實(shí)數(shù)符號(hào)位,30位是指數(shù)符號(hào)位,29---23是指數(shù)位,22---0位是有效數(shù)字位。注意第一位有效數(shù)字是不出現(xiàn)在內(nèi)存中的,它總是“1”。
????
???將一個(gè)實(shí)數(shù)轉(zhuǎn)化為C++實(shí)數(shù)存儲(chǔ)格式的步驟為:
???(1)先將這個(gè)實(shí)數(shù)的絕對(duì)值化為二進(jìn)制格式,注意實(shí)數(shù)的整數(shù)部分和小數(shù)部分化為二進(jìn)制的方法是不同的。
???(2)將這個(gè)二進(jìn)制格式實(shí)數(shù)的小數(shù)點(diǎn)左移或右移n位,直到小數(shù)點(diǎn)移動(dòng)到第一個(gè)有效數(shù)字的右邊。
???(3)從小數(shù)點(diǎn)右邊第一位開(kāi)始數(shù)出二十三位數(shù)字放入第22到第0位。
???(4)如果實(shí)數(shù)是正的,則在第31位放入“0”,否則放入“1”。
? ?(5)如果n是左移得到的,說(shuō)明指數(shù)是正的,第30位放入“1”。如果n是右移得到的或n=0,則第30位放入“0”。
???(6)如果n是左移得到的,則將n減去一然后化為二進(jìn)制,并在左邊加“0”補(bǔ)足七位,放入第29到第23位。如果n是右移得到的或n=0,則將n化為二進(jìn)制后在左邊加“0”補(bǔ)足七位,再各位求反,再放入第29到第23位。
????
???將一個(gè)計(jì)算機(jī)里存儲(chǔ)的實(shí)數(shù)格式轉(zhuǎn)化為通常的十進(jìn)制的格式的方法如下:
???(1)將第22位到第0位的二進(jìn)制數(shù)寫(xiě)出來(lái),在最左邊補(bǔ)一位“1”,得到二十四位有效數(shù)字。將小數(shù)點(diǎn)點(diǎn)在最左邊那個(gè)“1”的右邊。
???(2)取出第29到第23位所表示的值n。當(dāng)30位是“0”時(shí)將n各位求反。當(dāng)30位是“1”時(shí)將n增1。
???(3)將小數(shù)點(diǎn)左移n位(當(dāng)30位是“0”時(shí))或右移n位(當(dāng)30位是“1”時(shí)),得到一個(gè)二進(jìn)制表示的實(shí)數(shù)。
???(4)將這個(gè)二進(jìn)制實(shí)數(shù)化為十進(jìn)制,并根據(jù)第31位是“0”還是“1”加上正號(hào)或負(fù)號(hào)即可。
???特別地,實(shí)數(shù)0用C++的float格式表示是00000000000000000000000000000000。
如果還不太明白,這里舉幾個(gè)例子。
???一。將23.56化為C++的float格式。
???(1)將23.56化為二進(jìn)制后大約是“10111.1000111101011100001”。
???(2)將小數(shù)點(diǎn)左移四位,得到“1.01111000111101011100001”。
???(3)這已經(jīng)有了二十四位有效數(shù)字,將最左邊一位“1”去掉,得到“01111000111101011100001”。將它放入第22到第0位。
???(4)因?yàn)?3.56是正數(shù),因此在第31位放入“0”。
???(5)由于我們把小數(shù)點(diǎn)左移,因此在第30位放入“1”。
???(6)因?yàn)槲覀兪前研?shù)點(diǎn)左移4位,因此將4減去1得3,化為二進(jìn)制,并補(bǔ)足七位得到0000011,放入第29到第23位。
??? 完畢。
???如果把最左邊定為第31位,最右邊定為第0位,那么在C++里,float格式的23.56是這樣表示的:01000001101111000111101011100001。相應(yīng)地-23.56就是這樣表示的:11000001101111000111101011100001。
???二。將實(shí)數(shù)0.2356化為C++的float格式。
???(1)將0.2356化為二進(jìn)制后大約是0.00111100010100000100100000。
???(2)將小數(shù)點(diǎn)右移三位得到1.11100010100000100100000。
???(3)從小數(shù)點(diǎn)右邊數(shù)出二十三位有效數(shù)字,即11100010100000100100000放入第22到第0位。
???(4)由于0.2356是正的,所以在第31位放入“0”。
???(5)由于我們把小數(shù)點(diǎn)右移了,所以在第30位放入“0”。
???(6)因?yàn)樾?shù)點(diǎn)被右移了3位,所以將3化為二進(jìn)制,在左邊補(bǔ)“0”補(bǔ)足七位,得到0000011,各位取反,得到1111100,放入第29到第23位。
? ? ?完畢。因此0.2356用C++的float格式表示是:00111110011100010100000100100000。其中最左邊一位是第31位,最右邊一位是第0位。
???三。將實(shí)數(shù)1.0化為C++的float格式。
???(1)將1.0化為二進(jìn)制后是1.00000000000000000000000。
???(2)這時(shí)不用移動(dòng)小數(shù)點(diǎn)了,這就是我們?cè)谵D(zhuǎn)化方法里說(shuō)的n=0的情況。
???(3)將小數(shù)點(diǎn)右邊的二十三位有效數(shù)字00000000000000000000000放入第22到第0位。
???(4)因?yàn)?.0是正的,所以在第31位里放入“0”。
???(5)因?yàn)閚=0,所以在第30位里放入“0”。
???(6)因?yàn)閚=0,所以將0補(bǔ)足七位得到0000000,各位求反得到1111111,放入第29到第23位。
? ? ?完畢。所以實(shí)數(shù)1.0用C++的float格式表示是:00111111100000000000000000000000。其中最左邊一位是第31位,最右邊一位是第0位。
???這是IEEE短實(shí)數(shù)格式,適合X86cpu。