您的位置:首页 > 编程语言 > C语言/C++

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

2014-03-25 21:43 387 查看

    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)a a在内存中的值转换成int型。

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

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

             作者:Louise http://blog.csdn.net/yupingliu
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++