float a = 1.0f;
cout < < (int)a < < endl;
cout < < (int&)a < < endl;
cout < < boolalpha < < ( (int)a == (int&)a ) < < endl; // 輸出什么,?
float b = 0.0f;
cout < < (int)b < < endl;
cout < < (int&)b < < endl;
cout < < boolalpha < < ( (int)b == (int&)b ) < < endl; // 輸出什么,?
輸出啥? 不明白 (int &)a是啥意識,?為啥兩個(gè)比較的出結(jié)果不同,。
----------------------------------------------------
cout < < boolalpha < < ( (int)a == (int&)a ) < < endl;
// 輸出 false, 因?yàn)?float 的 1 和 int 的 1 在內(nèi)存里的表示不一樣。
...
cout < < boolalpha < < ( (int)b == (int&)b ) < < endl; // 輸出 true
// 輸出 true, 因?yàn)?float 的 0 和 int 的 0 在內(nèi)存里的表示是一樣的,。
(int &)a 就表示 不管 a 是什么,,我都當(dāng)他是一個(gè)int變量,。
從機(jī)器碼的角度來說,變量a會被翻譯成一個(gè)內(nèi)存地址,,(int &)a 就是說,,這個(gè)內(nèi)存地址里的內(nèi)容它是一個(gè)整數(shù)。
(int)a 呢不同:如果 a 不是整數(shù),,就會按規(guī)則轉(zhuǎn)換成整數(shù),,存入另一個(gè)地址(或臨時(shí)變量)中去。
浮點(diǎn)數(shù)的 1.0f 在內(nèi)存里是這樣表示的:
0011 1111 1000 0000 00000000 00000000
這個(gè)32位二進(jìn)制數(shù)被當(dāng)作整數(shù)輸出就是:
1065353216
而整數(shù)的 1 在內(nèi)存里是這樣表示的:
0000 0000 0000 0000 00000000 00000001
所以 (int)a != (int&)a
浮點(diǎn)的0和整數(shù)的0 在內(nèi)存里都是:
0000 0000 0000 0000 00000000 00000000
所以 (int)b == (int&)b
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <conio.h>
using namespace std;
int main()
{
float a = 1.0f;
cout << sizeof(int) <<endl;//4
cout << sizeof(float) <<endl;//4
cout << (int)a << endl;//1
cout << &a << endl; /* 取a的地址十六進(jìn)制0012FF7C*/
cout << (int)&a << endl; /*(int)&a:把a(bǔ)的地址強(qiáng)制轉(zhuǎn)換成十進(jìn)制的整型1245052*/
cout << (int&)a << endl;
/*(int&)a:將a的引用強(qiáng)制轉(zhuǎn)換為整型,意思是a所在的內(nèi)存,,本來定義的時(shí)候?yàn)閒loat類型,并初始為1.0f,,
但現(xiàn)在我要按int類型解釋這段內(nèi)存(也就是說a所在的內(nèi)存地址中的數(shù)據(jù)本來是按float型存儲表示的,你非要按int型來解釋不可),。
1.0f 在內(nèi)存中的存儲為 0011 1111 1000 0000 0000 0000 0000 0000. 把他按整型數(shù)解釋為2^29+2^28+2^27+2^26+2^25+2^24+2^23=1065353216
(int&)a 相當(dāng)于*(int*)&a ; *(int*)(&a) ; *((int*)&a)
*/
cout << boolalpha << ((int)a == (int&)a ) << endl;// 輸出false.因?yàn)?!=1065353216.
float b = 0.0f;
cout << (int)b << endl;//0
cout << &b << endl;/*取b的地址十六進(jìn)制0012FF78*/
cout << (int&)b << endl;//0
cout << boolalpha << ((int)b == (int&)b ) << endl;// 輸出true,因?yàn)?==0;
/*
(int&)a 不經(jīng)過轉(zhuǎn)換,, 直接得到a在內(nèi)存單元(就是地址)的值
(int)a a在內(nèi)存中的值轉(zhuǎn)換成int類型
float類型在內(nèi)存中存儲的形式是 ,符號位 指數(shù) 尾數(shù)
由754標(biāo)準(zhǔn):階碼采用增碼(該數(shù)補(bǔ)碼的反符號),尾數(shù)采用原碼
所以1.0f 在內(nèi)存中的形式為
0011 1111 1000 0000 0000 0000 0000 0000
所以輸出的是 0x3f800000
0 在內(nèi)存中的的存儲形式
0000 0000 0000 0000 0000 0000 0000 0000
*/
return 0;
}
【參考資料】
========================c語言中FLOAT 是如何表示的===========================
c語言中FLOAT 是如何表示的?尾數(shù),,階碼是如何在32位上安排的,,即哪幾位是尾數(shù),哪幾位是階碼,,那一位是符號位,。聽說與CPU有關(guān),是真的嗎,?
在C++里,,實(shí)數(shù)(float)是用四個(gè)字節(jié)即三十二位二進(jìn)制位來存儲的。其中有1位符號位,,8位指數(shù)位和23位有效數(shù)字位,。實(shí)際上有效數(shù)字位是24位,因?yàn)榈?
一位有效數(shù)字總是"1",,不必存儲. 有效數(shù)字位是一個(gè)二進(jìn)制純小數(shù),。
8位指數(shù)位中第一位是符號位,這符號位和一般的符號位不同,,它用"1"代表正,,用"0"代表負(fù)。整個(gè)實(shí)數(shù)的符號位用"1"代表負(fù),,"0"代表正,。
在這存儲實(shí)數(shù)的四個(gè)字節(jié)中,將最高地址字節(jié)的最高位編號為31,,最低地址字節(jié)的最低位編號為0,,則實(shí)數(shù)各個(gè)部分在這32個(gè)二進(jìn)制位中的分布是這樣的:
31位是實(shí)數(shù)符號位,30位是指數(shù)符號位,,29---23是指數(shù)位,,22---0位是有效數(shù)字位,。
注意第一位有效數(shù)字是不出現(xiàn)在內(nèi)存中的,它總是"1",。
將一個(gè)實(shí)數(shù)轉(zhuǎn)化為C++實(shí)數(shù)存儲格式的步驟為:
(1)先將這個(gè)實(shí)數(shù)的絕對值化為二進(jìn)制格式,,注意實(shí)數(shù)的整數(shù)部分和小數(shù)部分化為二進(jìn)制的方法是不同的。
(2)將這個(gè)二進(jìn)制格式實(shí)數(shù)的小數(shù)點(diǎn)左移或右移n位,,直到小數(shù)點(diǎn)移動到第一個(gè)有效數(shù)字的右邊,。
(3)從小數(shù)點(diǎn)右邊第一位開始數(shù)出二十三位數(shù)字放入第22到第0位。
(4)如果實(shí)數(shù)是正的,,則在第31位放入"0",,否則放入"1"。
(5)如果n 是左移得到的,,說明指數(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ī)里存儲的實(shí)數(shù)格式轉(zhuǎn)化為通常的十進(jìn)制的格式的方法如下:
(1)將第22位到第0位的二進(jìn)制數(shù)寫出來,在最左邊補(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"加上正號或負(fù)號即可,。
特別地,,實(shí)數(shù)0用C++的float格式表示是0000000000000000000000000000000
0。
如果還不太明白,,這里舉幾個(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í)不用移動小數(shù)點(diǎn)了,,這就是我們在轉(zhuǎn)化方法里說的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位,。
摘自:http://sohu2000000.spaces./blog/cns!87FC8F72BEB4FD03!732.entry?sa=820451422