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