打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
有关(int&)和(int)的区别
前两天参加惠普的一个实习生笔试考试,遇到了这样一个问题,纠结了很久,回来写程序测试了一下,又上网查了下相关的帖子,找到一篇文章详细地解释了有关 (int&) 和 (int) 的区别,就顺手拈了过来。原文链接:http://www.cnblogs.com/from20100719/articles/1845238.html
先看一段程序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include "stdafx.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
float a = 1.0f;
cout<<(int)a<<endl;
cout<<&a<<endl;
cout<<(int&)a<<endl;
cout<<boolalpha<<((int)a == (int&)a)<<endl;
cout<<"~~~~~~~~~~~~~~~~~~~"<<endl;
float b=0.0f;
cout<<(int)b<<endl;
cout<<&b<<endl;
cout<<(int&)b<<endl;
cout<<boolalpha<<((int)b == (int&)b)<<endl;
cout<<"~~~~~~~~~~~~~~~~~~~"<<endl;
int c=22;
cout<<&c<<endl;
cout<<(int&)c<<endl;
return 0;
}
这段程序的输出会是什么呢?
显然(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
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
(int&)a和(int)a的区别
浮点数的表示与类型转换-追逐理想-博客园
3.6 算数运算符
float和double变量的内存布局~~~~~~
C++ 数据类型
(int &)a 和(int)a
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服