1. float a = 1.0f;  
  2.  
  3. cout < < (int)a < < endl;  
  4.  
  5. cout < < (int&)a < < endl;  
  6.  
  7. cout < < boolalpha < < ( (int)a == (int&)a ) < < endl; // 输出什么?  
  8.  
  9. float b = 0.0f;  
  10.  
  11. cout < < (int)b < < endl;  
  12.  
  13. cout < < (int&)b < < endl;  
  14.  
  15. cout < < boolalpha < < ( (int)b == (int&)b ) < < endl; // 输出什么?  

输出啥?不明白 (int &)a是啥意识?为啥两个比较的出结果不同。

----------------------------------------------------

  1. cout < < boolalpha < < ( (int)a == (int&)a ) < < endl;  

// 输出 false, 因为 float 的 1 和 int 的 1 在内存里的表示不一样。

...

  1. cout < < boolalpha < < ( (int)b == (int&)b ) < < endl; // 输出 true  

// 输出 true, 因为 float 的 0 和 int 的 0 在内存里的表示是一样的。

(int &)a 就表示 不管 a 是什么,我都当他是一个int变量。

从机器码的角度来说,变量a会被翻译成一个内存地址,(int &)a 就是说,这个内存地址里的内容它是一个整数。

(int)a 呢不同:如果 a 不是整数,就会按规则转换成整数,存入另一个地址(或临时变量)中去。

浮点数的 1.0f 在内存里是这样表示的:

0011 1111 1000 0000 00000000 00000000

这个32位二进制数被当作整数输出就是:

1065353216

而整数的 1 在内存里是这样表示的:

0000 0000 0000 0000 00000000 00000001

所以 (int)a != (int&)a

浮点的0和整数的0 在内存里都是:

0000 0000 0000 0000 00000000 00000000

所以 (int)b == (int&)b

  1. <span style="font-size:16px;">#include <iostream>  
  2.  
  3. #include <stdio.h>  
  4.  
  5. #include <string.h>  
  6.  
  7. #include <conio.h>  
  8.  
  9. using namespace std;  
  10.  
  11.  
  12. int main()  
  13.  
  14. {  
  15.  
  16. float a = 1.0f;  
  17.  
  18.  
  19. cout << sizeof(int) <<endl;//4  
  20.  
  21. cout << sizeof(float) <<endl;//4  
  22.  
  23.  
  24. cout << (int)a << endl;//1  
  25.  
  26. cout << &a << endl; /* 取a的地址十六进制0012FF7C*/  
  27.  
  28. cout << (int)&a << endl; /*(int)&a:把a的地址强制转换成十进制的整型1245052*/  
  29.  
  30. cout << (int&)a << endl;</span>  

/*(int&)a:将a的引用强制转换为整型,意思是a所在的内存,本来定义的时候为float类型,并初始为1.0f,

但现在我要按int类型解释这段内存(也就是说a所在的内存地址中的数据本来是按float型存储表示的,你非要按int型来解释不可)。

1.0f 在内存中的存储为 0011 1111 1000 0000 0000 0000 0000 0000. 把他按整型数解释为2^29+2^28+2^27+2^26+2^25+2^24+2^23=1065353216

(int&)a 相当于*(int*)&a ; *(int*)(&a) ; *((int*)&a)

*/

  1. <span style="font-size:16px;">cout << boolalpha << ((int)a == (int&)a ) << endl;// 输出false.因为1!=1065353216.  
  2.  
  3.  
  4. float b = 0.0f;  
  5.  
  6. cout << (int)b << endl;//0  
  7.  
  8. cout << &b << endl;/*取b的地址十六进制0012FF78*/  
  9.  
  10. cout << (int&)b << endl;//0  
  11.  
  12. cout << boolalpha << ((int)b == (int&)b ) << endl;// 输出true,因为0==0;</span>  

/*

(int&)a 不经过转换, 直接得到a在内存单元(就是地址)的值

(int)a a在内存中的值转换成int类型

float类型在内存中存储的形式是 ,符号位 指数 尾数

由754标准:阶码采用增码(该数补码的反符号),尾数采用原码

所以1.0f 在内存中的形式为

0011 1111 1000 0000 0000 0000 0000 0000

所以输出的是 0x3f800000

0 在内存中的的存储形式

0000 0000 0000 0000 0000 0000 0000 0000

*/

 

int& fun1( int & r ){ return r; }

int fun2( void ){ return 10; }

int i = 20;

fun2( ) = 30;                               //A

cout << ( fun1( i ) = 30 );          //B

(  int & )10 = 20;                        //C

( const int & )10 = 20;              //D

( int & )i = 40;                             //E

( double & )i = 50;                     //F

cout << ( double & )i;               //G

A: fun2的返回值是一个右值,不能作为内置赋值表达式的左操作数,因此A是错误的;

B: fun1返回一个引用,属于左值,因此可以作为内置赋值运算符的左操作数;

C: C试图将一个右值强制转换为引用,但是,只有const引用才能引用一个右值,因此错  误;

D: D比C进步了一点,强制转换为const引用,但仍然是错误的,因为const引用属于不可修改的左值,不能通过const引用修改其引用的对象;

E: E将一个int变量强制转换为int引用并被修改。这个表达式容易出现误解,以为i被临时转换为一个引用,其实不然,( int& )i只是产生一个引用到i的临时引用,i是被引用的对象而非引用本身,被修改的是i的值;

F、G:F和G与E一样,都产生一个引用到i的临时引用,但存在两个问题,一是由于i的类型与double&所引用的类型不同,i的底层布局从double&的角度看来是double,F中的50先被转换为double,再存进i,存进i的内容并非int格式的50,而是浮点数格式的50,如果此时打印i的值,结果将为一个“混乱”的整数;二是由于double和int的二进制宽度不一定相同,如果double宽度大于int,则F和G都将导致未定义行为。

(int &)a 和(int)a的更多相关文章

  1. Convert.ToInt32()、int.Parse()和(int)三者的区别

    Convert.ToInt32将object类类型转换成int类型,如Convert.ToInt32(session["shuzi"]); (int)适合简单数据类型之间的转换: ...

  2. 深度解析C语言int与unsigned int

    就如同int a:一样,int 也能被其它的修饰符修饰.除void类型外,基本数据类型之前都可以加各种类型修饰符,类型修饰符有如下四种:1.signed----有符号,可修饰char.int.Int是 ...

  3. C#中(int)、int.Parse()、int.TryParse()和Convert.ToInt32()的区别

    转自:http://www.cnblogs.com/leolis/p/3968943.html 在编程过程中,数据转换是经常要用到的,C#中数据转换的方法很多,拿将目标对象转换为 整型(int)来讲, ...

  4. what is difference in (int)a,(int&)a,&a,int(&a) ?

    This interview question come from a famous communication firm of china. : ) #include <iostream> ...

  5. int(3)和int(10)的区别

    int(M) 在 integer 数据类型中,M 表示最大显示宽度.在 int(M) 中,M 的值跟 int(M) 所占多少存储空间并无任何关系. int(3).int(4).int(8) 在磁盘上都 ...

  6. C#中(int)、int.Parse()、int.TryParse()和Convert.ToInt32()的区别 <转>

    作者:Statmoon 出处:http://leolis.cnblogs.com/   在编程过程中,数据转换是经常要用到的,C#中数据转换的方法很多,拿将目标对象转换为整型(int)来讲,有四种方法 ...

  7. 【C】二级指针探秘 & 星号的两种用法(1.与基本类型结合形成另一种类型,比如与int结合形成int* 2.取值操作)

    1)问题:二级指针到底是什么?怎么用的?怎么存放的? #include <stdio.h> #define TEST_ADDR 0x12FF40 void main() { int a = ...

  8. int.Parse()、int.TryParse()和Convert.ToInt32()的区别

    1:int.Parse(一个参数)        此参数必须满足: 1 只能是字符串: 2 只能是 “整型” 字符串,即各种整型ToString()之后的形式,也不能为浮点型. 2:int.TryPa ...

  9. (int)、int.Parse()、int.TryParse()和Convert.ToInt32()的区别

    C#中(int).int.Parse().int.TryParse()和Convert.ToInt32()的区别   原文链接:http://www.cnblogs.com/leolis/p/3968 ...

  10. Java-集合-第三题 有如下Student 对象, private String name; private int age; private int score; private String classNum; 其中,classNum 表示学生的班号,例如“class05”。 有如下List List list = new ArrayList(); l

    第三题 有如下Student 对象, private String name; private int age; private int score; private String classNum; ...

随机推荐

  1. ExtJS学习之路第八步:Window组件

    一个专门Panel用作程序窗口.默认的,Window可以是浮动的(floated).可缩放(resizable)以及可拖动的(draggable).Window能够被最大化适应可视窗口,(restor ...

  2. IOS开发中滑动页面时NSTimer停止的问题

    我们在做倒计时的时候,发现当你手指按着屏幕不放,拖动tableView滑动的时候,写在cell上得倒计时停止倒计时,松开继续倒计时.研究发现就是拖动tableView滑动时,NSTimer停止了. 这 ...

  3. hibernate操作数据库例子

    1.工程目录结构如下 2.引入需要的jar包,如上图. 3.创建持久化类User对应数据库中的user表 package com.hibernate.配置文件.pojo; import java.sq ...

  4. Unity3D研究院之动态修改烘培贴图的大小&脚本烘培场景

    Unity默认烘培场景以后每张烘培贴图的大小是1024.但是有可能你的场景比较简单,用1024会比较浪费.如下图所示,这是我的一个场景的烘培贴图,右上角一大部分完全是没有用到,但是它却占着空间.  有 ...

  5. Unity3D Optimizing Graphics Performance for iOS

    原地址:http://blog.sina.com.cn/s/blog_72b936d801013ptr.html icense Comparisons http://unity3d.com/unity ...

  6. Resources in Visual Tracking(转载)

    这位博主总结了比较新的tracking方面的资源:http://blog.csdn.net/minstyrain/article/details/38640541 http://xilinx.eetr ...

  7. 阿里云服务器配置 SVN 服务器与生产站点同步

    作为linux的门外汉,一直觊觎svn的方便性,在有台aliyun的情况下,一起来搞搞.   1.环境   阿里云 centos5.5   2.安装svn   yum -y install subve ...

  8. Python strip、lstrip和rstrip的用法

    Python中strip用于去除字符串的首尾字符,同理,lstrip用于去除左边的字符,rstrip用于去除右边的字符. 这三个参数都可以传入一个参数,指定要去除的首尾字符. 需要注意的是,传入的是一 ...

  9. 【JavaScript】SVG vs Canvas vs WebGL

    参考资料: http://blog.csdn.net/lufy_legend/article/details/38292125 http://zhidao.baidu.com/link?url=e4n ...

  10. 【云计算】Docker云平台—Docker基础

    Docker云平台系列共三讲,此为第一讲:Docker基础 参考资料: Docker官方文档:https://docs.docker.com/ Docker从入门到实践:https://yeasy.g ...