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)輸出什麼?
輸出結果是:
11065353216
false00
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
#include
#include
using namespace std;
int main()
(int&)a == static_cast (a)
(int)&a == reinterpret_cast (&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。
int a和 int a的區別
cpp view plain copy include include include using namespace std intmain int a static cast a int a reinterpret cast a int a 不經過轉換,直接得到a在記憶體單元的值,並將其轉換成整...
int a和 int a的區別
先從一到面試題說起 includeusing namespace std int main 輸出結果為 0 0 5 66在上面已經知道float型125.5在記憶體中存放方式為 00000000 低位址 00000000 11111011 01000010 高位址 因此對於p和p 1指向的單元,其中...
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 ...