Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2316179
  • 博文数量: 252
  • 博客积分: 5472
  • 博客等级: 大校
  • 技术积分: 3107
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-17 18:39
文章分类

全部博文(252)

文章存档

2012年(96)

2011年(156)

分类: C/C++

2012-05-21 15:09:50


  1. #include "stdafx.h"
  2. #include <iostream>
  3.  
  4. using namespace std;
  5.  
  6. int _tmain(int argc, _TCHAR* argv[])
  7. {
  8.     float a = 1.0f;
  9.     cout<<(int)a<<endl;
  10.     cout<<&a<<endl;
  11.     cout<<(int&)a<<endl;
  12.     cout<<boolalpha<<((int)a == (int&)a)<<endl;
  13.     cout<<"~~~~~~~~~~~~~~~~~~~"<<endl;
  14.      
  15.     float b=0.0f;
  16.     cout<<(int)b<<endl;
  17.     cout<<&b<<endl;
  18.     cout<<(int&)b<<endl;
  19.     cout<<boolalpha<<((int)b == (int&)b)<<endl;
  20.     cout<<"~~~~~~~~~~~~~~~~~~~"<<endl;
  21.  
  22.     int c=22;
  23.     cout<<&c<<endl;
  24.     cout<<(int&)c<<endl;
  25.  
  26.     return 0;
  27. }

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


阅读(2125) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~