(int &)a 和(int)a
- float a = 1.0f;
- cout < < (int)a < < endl;
- cout < < (int&)a < < endl;
- cout < < boolalpha < < ( (int)a == (int&)a ) < < endl; // 输出什么?
- float b = 0.0f;
- cout < < (int)b < < endl;
- cout < < (int&)b < < endl;
- cout < < boolalpha < < ( (int)b == (int&)b ) < < endl; // 输出什么?
输出啥?不明白 (int &)a是啥意识?为啥两个比较的出结果不同。
----------------------------------------------------
- cout < < boolalpha < < ( (int)a == (int&)a ) < < endl;
// 输出 false, 因为 float 的 1 和 int 的 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
- <span style="font-size:16px;">#include <iostream>
- #include <stdio.h>
- #include <string.h>
- #include <conio.h>
- using namespace std;
- int main()
- {
- float a = 1.0f;
- cout << sizeof(int) <<endl;//4
- cout << sizeof(float) <<endl;//4
- cout << (int)a << endl;//1
- cout << &a << endl; /* 取a的地址十六进制0012FF7C*/
- cout << (int)&a << endl; /*(int)&a:把a的地址强制转换成十进制的整型1245052*/
- 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)
*/
- <span style="font-size:16px;">cout << boolalpha << ((int)a == (int&)a ) << endl;// 输出false.因为1!=1065353216.
- float b = 0.0f;
- cout << (int)b << endl;//0
- cout << &b << endl;/*取b的地址十六进制0012FF78*/
- cout << (int&)b << endl;//0
- 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的更多相关文章
- Convert.ToInt32()、int.Parse()和(int)三者的区别
Convert.ToInt32将object类类型转换成int类型,如Convert.ToInt32(session["shuzi"]); (int)适合简单数据类型之间的转换: ...
- 深度解析C语言int与unsigned int
就如同int a:一样,int 也能被其它的修饰符修饰.除void类型外,基本数据类型之前都可以加各种类型修饰符,类型修饰符有如下四种:1.signed----有符号,可修饰char.int.Int是 ...
- C#中(int)、int.Parse()、int.TryParse()和Convert.ToInt32()的区别
转自:http://www.cnblogs.com/leolis/p/3968943.html 在编程过程中,数据转换是经常要用到的,C#中数据转换的方法很多,拿将目标对象转换为 整型(int)来讲, ...
- what is difference in (int)a,(int&)a,&a,int(&a) ?
This interview question come from a famous communication firm of china. : ) #include <iostream> ...
- int(3)和int(10)的区别
int(M) 在 integer 数据类型中,M 表示最大显示宽度.在 int(M) 中,M 的值跟 int(M) 所占多少存储空间并无任何关系. int(3).int(4).int(8) 在磁盘上都 ...
- C#中(int)、int.Parse()、int.TryParse()和Convert.ToInt32()的区别 <转>
作者:Statmoon 出处:http://leolis.cnblogs.com/ 在编程过程中,数据转换是经常要用到的,C#中数据转换的方法很多,拿将目标对象转换为整型(int)来讲,有四种方法 ...
- 【C】二级指针探秘 & 星号的两种用法(1.与基本类型结合形成另一种类型,比如与int结合形成int* 2.取值操作)
1)问题:二级指针到底是什么?怎么用的?怎么存放的? #include <stdio.h> #define TEST_ADDR 0x12FF40 void main() { int a = ...
- int.Parse()、int.TryParse()和Convert.ToInt32()的区别
1:int.Parse(一个参数) 此参数必须满足: 1 只能是字符串: 2 只能是 “整型” 字符串,即各种整型ToString()之后的形式,也不能为浮点型. 2:int.TryPa ...
- (int)、int.Parse()、int.TryParse()和Convert.ToInt32()的区别
C#中(int).int.Parse().int.TryParse()和Convert.ToInt32()的区别 原文链接:http://www.cnblogs.com/leolis/p/3968 ...
- 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; ...
随机推荐
- UVALive 6125 I’ve Got Your Back(gammon) 题解
http://vjudge.net/problem/viewProblem.action?id=37481 East Central Regional Contest Problem D: I’ve ...
- javascript模板方法模式
一:什么是模板方法模式: 模板方法模式由二部分组成,第一部分是抽象父类,第二部分是具体实现的子类,一般的情况下是抽象父类封装了子类的算法框架,包括实现一些公共方法及封装子类中所有方法的执行顺序,子类可 ...
- CSS简写指南
高效的css写法中的一条就是使用简写.通过简写可以让你的CSS文件更小,更易读.而了解CSS属性简写也是前端开发工程师的基本功之一.今天我们系统地总结一下CSS属性的缩写. 色彩缩写 色彩的缩写最简单 ...
- IIS网站发布部署
Windows—控制面板——程序和功能——打开或关闭Windows功能——Internet信息服务(IIS),一定要选中ASP.Net. 1.打开你的VS2012网站项目,右键点击项目>菜单中 ...
- WPF 动画(形状、画刷)
一:形状 在WPF用户界面中,可以通过形状(Shape)来绘制直线.椭圆.矩形及一些多边形的类.通过这些基本的图像,组合成为复杂的图形. Shape类中,主要的形状有Rectangle(),Ellip ...
- Linux Tomcat 简介
如今,基于Web的应用越来越多,传统的Html已经满足不了如今的需求.我们需要一个交互式的Web,于是便诞生了各种Web语言.如Asp,Jsp,Php等.当然,这些语言与传统的语言有着密切的联系,如P ...
- HDOJ 1102 生成树
Constructing Roads Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- 每天一个命令day1【diff 命令】(具体实例看下一节)
diff 命令是 linux上非常重要的工具,用于比较文件的内容,特别是比较两个版本不同的文件以找到改动的地方.diff在命令行中打印每一个行的改动.最新版本的diff还支持二进制文件.diff程序的 ...
- 利用jQuery.validate异步验证用户名是否存在
转:http://www.cnblogs.com/linzheng/archive/2010/10/14/1851781.html HTML头部引用: <script type="te ...
- swfit 中的类型属性说明
swift 中不叫做类属性,叫类型属性,因为在swift中,struct 和enum也是可以有这种属性的,叫类属性明显不准. 有以下注意事项: 对于值类型(指结构体和枚举)可以定义存储型和计算型类型属 ...