(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

#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; 


/*(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)

*/

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; 


/*

(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

*/

return 0; 

} 


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值