有關(int&)和(int)的區別

先看一段程序

  1. #include "stdafx.h" 
  2. #include <iostream> 
  3.  
  4. using namespace std; 
  5.  
  6. int _tmain(int argc, _TCHAR* argv[]) 
  7.     float a = 1.0f; 
  8.     cout<<(int)a<<endl; 
  9.     cout<<&a<<endl; 
  10.     cout<<(int&)a<<endl; 
  11.     cout<<boolalpha<<((int)a == (int&)a)<<endl; 
  12.     cout<<"~~~~~~~~~~~~~~~~~~~"<<endl; 
  13.      
  14.     float b=0.0f; 
  15.     cout<<(int)b<<endl; 
  16.     cout<<&b<<endl; 
  17.     cout<<(int&)b<<endl; 
  18.     cout<<boolalpha<<((int)b == (int&)b)<<endl; 
  19.     cout<<"~~~~~~~~~~~~~~~~~~~"<<endl; 
  20.  
  21.     int c=22; 
  22.     cout<<&c<<endl; 
  23.     cout<<(int&)c<<endl; 
  24.  
  25.     return 0; 

這段程序的輸出會是什麼呢?

顯然(int)a是將a的值轉換成int型

&a則是a的內存地址的二進制表示

那麼(int&)a是什麼呢?是否等於(int)&a呢?

【注意:(int)&a實際是將二進制的地址轉化成int型】

我們看一下程序運行的結果:

p_w_picpath

(int&)a的值很古怪,1065353216

不妨嘗試輸出(int)&a,就會發現(int&)a≠(int)&a

實際上,(int&a)是與*((int*)&a)等價的,意思都是將&a這個地址上的32位看成int型,即使存儲在這裏的可能不是int型數據

(int&)a爲什麼會是1065353216呢?

這和浮點數在內存中的存儲格式有關,float 1.0在內存中存儲爲(按IEEE754規定):


符號位           階(8位)                          尾數(23位)
   0            01111111       000 0000000000 0000000000

於是將其看做int型數值的話

00111111100000000000000000000000(2)   =   1065353216(10)

這正是程序輸出的結果

小結:

(int)a實際上是以浮點數a爲參數構造了一個整型數,該整數的值是1。

(int&)a則是告訴編譯器將a當作整數看(並沒有做任何實質上的轉換)。

因爲1以整數形式存放和以浮點形式存放其內存數據是不一樣的,因此兩者不等。

對b的兩種轉換意義同上,但是0的整數形式和浮點形式其內存數據是一樣的,因此在這種特殊情形下,兩者相等(僅僅在數值意義上)。

 

~The end~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章