1. 程式人生 > >(int&) 與int(&)

(int&) 與int(&)

#include<iostream>
using namespace std;
int main()
{
float a = 1.0f;
cout << sizeof(int) <cout << sizeof(float) <
cout << (int)a << endl;//1
cout << &a << endl; /*取a的地址十六進位制0012FF7C*/
cout << (int)&a << endl;/*(int)&a:把a的地址強制轉換成十進位制的整型1065353216*/
cout << (int&)a << endl;
/*實際上,(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)
把他按整型數解釋為2^29+2^28+2^27+2^26+2^25+2^24+2^23=1065353216
(int&)a 相當於
    *(int*)&a
    *(int*)(&a)
    *((int*)&a)
*/     

cout << boolalpha << ((int)a == (int&)a ) << endl;//   輸出false.因為1!=1065353216.
float b = 0.0f;
cout << (int)b << endl;//0
cout << &b << endl;/*取b的地址十六進位制0012FF78*/
cout << (int&)b << endl;//0
cout << boolalpha << ((int)b == (int&)b ) << endl;//   輸出true,因為0==0;
/*
(int&)a   不經過轉換,   直接得到a在記憶體單元(就是地址)的值   
(int)a     a在記憶體中的值轉換成int型別 */
}