公司應(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.因為1!=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,因為0==0;
return 0;
}
========================c語言中FLOAT是如何表示的===========================
c語言中FLOAT 是如何表示的?尾數(shù),階碼是如何在32位上安排的,即哪幾位是尾數(shù),哪幾位是階碼,那一位是符號位。聽說與CPU有關(guān),是真的嗎?
???在C++里,實數(shù)(float)是用四個字節(jié)即三十二位二進制位來存儲的。其中有1位符號位,8位指數(shù)位和23位有效數(shù)字位。實際上有效數(shù)字位是24位,因為第一位有效數(shù)字總是“1”,不必存儲。
???有效數(shù)字位是一個二進制純小數(shù)。8位指數(shù)位中第一位是符號位,這符號位和一般的符號位不同,它用“1”代表正,用”0“代表負。整個實數(shù)的符號位用“1”代表負,“0”代表正。
???在這存儲實數(shù)的四個字節(jié)中,將最高地址字節(jié)的最高位編號為31,最低地址字節(jié)的最低位編號為0,則實數(shù)各個部分在這32個二進制位中的分布是這樣的:31位是實數(shù)符號位,30位是指數(shù)符號位,29---23是指數(shù)位,22---0位是有效數(shù)字位。注意第一位有效數(shù)字是不出現(xiàn)在內(nèi)存中的,它總是“1”。
????
???將一個實數(shù)轉(zhuǎn)化為C++實數(shù)存儲格式的步驟為:
???(1)先將這個實數(shù)的絕對值化為二進制格式,注意實數(shù)的整數(shù)部分和小數(shù)部分化為二進制的方法是不同的。
???(2)將這個二進制格式實數(shù)的小數(shù)點左移或右移n位,直到小數(shù)點移動到第一個有效數(shù)字的右邊。
???(3)從小數(shù)點右邊第一位開始數(shù)出二十三位數(shù)字放入第22到第0位。
???(4)如果實數(shù)是正的,則在第31位放入“0”,否則放入“1”。
? ?(5)如果n是左移得到的,說明指數(shù)是正的,第30位放入“1”。如果n是右移得到的或n=0,則第30位放入“0”。
???(6)如果n是左移得到的,則將n減去一然后化為二進制,并在左邊加“0”補足七位,放入第29到第23位。如果n是右移得到的或n=0,則將n化為二進制后在左邊加“0”補足七位,再各位求反,再放入第29到第23位。
????
???將一個計算機里存儲的實數(shù)格式轉(zhuǎn)化為通常的十進制的格式的方法如下:
???(1)將第22位到第0位的二進制數(shù)寫出來,在最左邊補一位“1”,得到二十四位有效數(shù)字。將小數(shù)點點在最左邊那個“1”的右邊。
???(2)取出第29到第23位所表示的值n。當30位是“0”時將n各位求反。當30位是“1”時將n增1。
???(3)將小數(shù)點左移n位(當30位是“0”時)或右移n位(當30位是“1”時),得到一個二進制表示的實數(shù)。
???(4)將這個二進制實數(shù)化為十進制,并根據(jù)第31位是“0”還是“1”加上正號或負號即可。
???特別地,實數(shù)0用C++的float格式表示是00000000000000000000000000000000。
如果還不太明白,這里舉幾個例子。
???一。將23.56化為C++的float格式。
???(1)將23.56化為二進制后大約是“10111.1000111101011100001”。
???(2)將小數(shù)點左移四位,得到“1.01111000111101011100001”。
???(3)這已經(jīng)有了二十四位有效數(shù)字,將最左邊一位“1”去掉,得到“01111000111101011100001”。將它放入第22到第0位。
???(4)因為23.56是正數(shù),因此在第31位放入“0”。
???(5)由于我們把小數(shù)點左移,因此在第30位放入“1”。
???(6)因為我們是把小數(shù)點左移4位,因此將4減去1得3,化為二進制,并補足七位得到0000011,放入第29到第23位。
??? 完畢。
???如果把最左邊定為第31位,最右邊定為第0位,那么在C++里,float格式的23.56是這樣表示的:01000001101111000111101011100001。相應(yīng)地-23.56就是這樣表示的:11000001101111000111101011100001。
???二。將實數(shù)0.2356化為C++的float格式。
???(1)將0.2356化為二進制后大約是0.00111100010100000100100000。
???(2)將小數(shù)點右移三位得到1.11100010100000100100000。
???(3)從小數(shù)點右邊數(shù)出二十三位有效數(shù)字,即11100010100000100100000放入第22到第0位。
???(4)由于0.2356是正的,所以在第31位放入“0”。
???(5)由于我們把小數(shù)點右移了,所以在第30位放入“0”。
???(6)因為小數(shù)點被右移了3位,所以將3化為二進制,在左邊補“0”補足七位,得到0000011,各位取反,得到1111100,放入第29到第23位。
? ? ?完畢。因此0.2356用C++的float格式表示是:00111110011100010100000100100000。其中最左邊一位是第31位,最右邊一位是第0位。
???三。將實數(shù)1.0化為C++的float格式。
???(1)將1.0化為二進制后是1.00000000000000000000000。
???(2)這時不用移動小數(shù)點了,這就是我們在轉(zhuǎn)化方法里說的n=0的情況。
???(3)將小數(shù)點右邊的二十三位有效數(shù)字00000000000000000000000放入第22到第0位。
???(4)因為1.0是正的,所以在第31位里放入“0”。
???(5)因為n=0,所以在第30位里放入“0”。
???(6)因為n=0,所以將0補足七位得到0000000,各位求反得到1111111,放入第29到第23位。
? ? ?完畢。所以實數(shù)1.0用C++的float格式表示是:00111111100000000000000000000000。其中最左邊一位是第31位,最右邊一位是第0位。
???這是IEEE短實數(shù)格式,適合X86cpu。