有关(int&)和(int)的区别
2015-10-24 11:39
309 查看
先看一段程序
?
这段程序的输出会是什么呢?
显然(int)a是将a的值转换成int型
&a则是a的内存地址的二进制表示
那么(int&)a是什么呢?是否等于(int)&a呢?
【注意:(int)&a实际是将二进制的地址转化成int型】
我们看一下程序运行的结果:
(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~
ps:
?
显然(int)a是将a的值转换成int型
&a则是a的内存地址的二进制表示
那么(int&)a是什么呢?是否等于(int)&a呢?
【注意:(int)&a实际是将二进制的地址转化成int型】
我们看一下程序运行的结果:
(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~
ps:
int&是引用,可以说是一个变量的别名,在定义时必须绑定到一个变量 比如int i = 0; int& n = i; n++; 这时i = 1 一般用在函数参数中 比如交换两个数 void Swap(int& a, int& b) { int temp = a; a = b; b = temp; } 这样调用这个函数 int x = 2, y = 3; Swap(a, b); 这是x = 3, y = 2; 而如果用void Swap(int a, int b) 则是复制x和y到函数里 不会改变x, y的值 display(ostream & out) 比如这里调用display(cout);则在函数里修改out,等同于修改cout 比如函数中out << 10 << endl; 等同于cout << 10 << endl; 而如果是display(ostream out);则out为cout的复制,并非本身 比如函数中out << 10 << endl; 但cout没有改变
相关文章推荐
- iOS动态更新
- python numpy.shape 和 numpy.reshape函数
- 不可执行内存页保护攻击--return to libc attack
- Exchange Server 2010 安装并配置证书服务器
- python numpy.shape 和 numpy.reshape函数
- 排序总结
- Dell Inspiron 7520 安装Ubuntu 14.04 LTS
- hdoj--3072--Intelligence System(scc+缩点+数据去重)
- Linux下使用cronolog切割服务器日志文件的方法
- osx下一个MobileBackups简介
- TCP/IP基础知识
- 大道至简第四章随笔
- hdoj--3072--Intelligence System(scc+缩点+数据去重)
- flume安装配置小结
- hdu2156取石子游戏(巴士博弈&&规律)
- Android SlidingMenu 使用详解
- OpenGL Bresenhan画线法
- 应该是引用了项目本身!从引用中册除对所在项目的引用就可以了!
- Java设计模式7:适配器模式
- Trace tempdb growth by xe