(int)a和(int)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; // (1)輸出什么?
float b = 0.0f;
cout << (int)b << endl;
cout << (int&)b << endl;
cout << boolalpha << ( (int)b == (int&)b ) << endl;// (2)輸出什么?
??????? 輸出結(jié)果是:
??????? 1
??????? 1065353216
??????? false
??????? 0
??????? 0
??????? true
??????
?
答:(1)(2)分別輸出false和true。注意轉(zhuǎn)換的應(yīng)用。(int)a實(shí)際上是以浮點(diǎn)數(shù)a為參數(shù)構(gòu)造了一個(gè)整型數(shù),該整數(shù)的值是1,(int&)a則是告訴編譯器將a當(dāng)作整數(shù)看(并沒(méi)有做任何實(shí)質(zhì)上的轉(zhuǎn)換)。因?yàn)?以整數(shù)形式存放和以浮點(diǎn)形式存放其內(nèi)存數(shù)據(jù)是不一樣的,因此兩者不等。對(duì)b的兩種轉(zhuǎn)換意義同上,但是0的整數(shù)形式和浮點(diǎn)形式其內(nèi)存數(shù)據(jù)是一樣的,因此在這種特殊情形下,兩者相等(僅僅在數(shù)值意義上)。
注意,程序的輸出會(huì)顯示(int&)a=1065353216,這個(gè)值是怎么來(lái)的呢?前面已經(jīng)說(shuō)了,1以浮點(diǎn)數(shù)形式存放在內(nèi)存中,按ieee754規(guī)定,其內(nèi)容為0x0000803F(已考慮字節(jié)反序)。這也就是a這個(gè)變量所占據(jù)的內(nèi)存單元的值。當(dāng)(int&)a出現(xiàn)時(shí),它相當(dāng)于告訴它的上下文:“把這塊地址當(dāng)做整數(shù)看待!不要管它原來(lái)是什么。”這樣,內(nèi)容0x0000803F按整數(shù)解釋,其值正好就是1065353216(十進(jìn)制數(shù))。
通過(guò)查看匯編代碼可以證實(shí)“(int)a相當(dāng)于重新構(gòu)造了一個(gè)值等于a的整型數(shù)”之說(shuō),而(int&)的作用則僅僅是表達(dá)了一個(gè)類型信息,意義在于為cout<<及==選擇正確的重載版本。
?
#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;
int main()
{
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 == static_cast <int&>(a)
(int)&a == reinterpret_cast <int>(&a);
(int&)a 不經(jīng)過(guò)轉(zhuǎn)換, 直接得到a在內(nèi)存單元的值,并將其轉(zhuǎn)換成整數(shù)輸出。
(int)a a在內(nèi)存中的值轉(zhuǎn)換成int類型
float類型在內(nèi)存中存儲(chǔ)的形式是 ,符號(hào)位 指數(shù) 尾數(shù)
由754標(biāo)準(zhǔn):階碼采用增碼(該數(shù)補(bǔ)碼的反符號(hào)),尾數(shù)采用原碼
所以1.0f 在內(nèi)存中的形式為
0011 1111 1000 0000 0000 0000 0000 0000
所以輸出的是 0x3f800000
0 在內(nèi)存中的的存儲(chǔ)形式
0000 0000 0000 0000 0000 0000 0000 0000
所以輸出的是0x00000000
所以前面一個(gè)是false,后面一個(gè)是true。
?
http://blog.csdn.net/lvbinandylau/archive/2009/06/25/4298766.aspx
http://blog.csdn.net/mobidogs/article/details/1530775
#c++ && mfc總結(jié)
以上是生活随笔為你收集整理的(int)a和(int)a的区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 程序员面试【Brainteasers】
- 下一篇: 动态规划基本问题