[C/C++](int)a,&a,(int)&a,(int&)a区别小结

    1.首先以下述代码为例:

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <conio.h>
using namespace std;

int main()
{
	float a = 1.0f;

	cout << (int)a << endl;		//将浮点型强制转换为整型1
	cout << &a << endl;		    //取a的地址十六进制00A7FD68
	cout << (int)&a << endl;	//把a的地址强制转换成十进制的整型11009384
	cout << (int&)a << endl;	//将a的引用强制转化为整型

	return 0;
}


    输出结果如下:

    


    "cout << (int&)a << endl;"输出的结果是1065353216, 而不是1。这是因为浮点数在内存里和整数的存储方式不同,(int&)a相当于将该浮点数地址开始的sizeof(int)个字节当成int型的数据输出,因此这取决于float型数据在内存中的存储方式,而不是经过(int&)a显示转换的结果(1)。

    因为float a = 1.0f在内存中的表示都是3f800000,而浮点数和一般整型不一样,所以当(int&a)强制转换时,会把内存值3f800000当作int型输出,所以结果自然变为了1065353216(0x3f800000的十进制表示)。


    要解释一下(int&)a:将a的引用强制转换为整型,意思是a所在的内存,原来定义的时候是float型,并初始化为1.01f,但现在要按int类型解释这段内存(即a所在的内存地址中的数据本来是按float型存储表示的,现在要强制按int型来解释)。

    1.0f在内存中的存储为(浮点型在内存中的表示详见此链接

    0   01111111   00000000000000000000000.

    按照整型数解释为2^29 + 2^28 + 2^27 + 2^26 + 2^25 + 2^24 + 2^23 = 1065353216(0x3f800000的十进制表示)。

    所以cout << (int&)a << endl;的结果就是1065353216。

 

    2.(int&a)

    (int&)a相当于:*(int*)&a,*(int*)(&a),*((int*)&a)。


     再比较一下(int&)a和(int)a

     (int&)a不经过转换,直接得到a在内存单元(即地址)的值(引用即别名,通过引用是可以直接访问到实参和控制参数的)。

     (int)aa在内存中的值转换成int型。


     本文参考http://wenku.baidu.com/link?url=76IpDCg9rWlQpZZnYON7NIYkl4BHY24rI6cyEso0XccroC9V6VCpDSr_AYuSY9Xzg3eNNYE6rKG8aJH5hhA-r7aNcS3RO0REFrpUIXFtFHG


     本文不详尽或错误之处,请各位不吝言辞,多多指教~谢谢~

             作者:Louise http://blog.csdn.net/yupingliu





版权声明:本文为YupingLiu原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。