int a和 int a的區別

2021-09-30 15:38:06 字數 1431 閱讀 6682

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 ...