有关(int&)和(int)的区别

先看一段程序

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型】

我们看一下程序运行的结果:

image

(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的整数形式和浮点形式其内存数据是一样的,因此在这种特殊情形下,两者相等(仅仅在数值意义上)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值