久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

(int &)a 和(int)a

 WUCANADA 2013-06-06

(int &)a 和(int)a

(int)a,、&a,、(int)&a、(int&)a的區(qū)別

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

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多