(int&)a和(int)a的区别

float a = 1.0f;
cout << (int)a << endl;
cout << (int&)a << endl; 
cout << boolalpha << ( (int)a == (int&)a ) << endl; // (1)输出什么?

float b = 0.0f;
cout << (int)b << endl;
cout << (int&)b << endl;
cout << boolalpha << ( (int)b == (int&)b ) << endl;// (2)输出什么?

输出结果是:
        1
        1065353216
        false
        0
        0
        true

答:(1)(2)分别输出false和true。注意转换的应用。(int)a实际上是以浮点数a为参数构造了一个整型数,该整数的值是1,(int&)a则是告诉编译器将a当作整数看(并没有做任何实质上的转换)。因为1以整数形式存放和以浮点形式存放其内存数据是不一样的,因此两者不等。对b的两种转换意义同上,但是0的整数形式和浮点形式其内存数据是一样的,因此在这种特殊情形下,两者相等(仅仅在数值意义上)。
注意,程序的输出会显示(int&)a=1065353216,这个值是怎么来的呢?前面已经说了,1以浮点数形式存放在内存中,按ieee754规定,其内容为0x0000803F(已考虑字节反序)。这也就是a这个变量所占据的内存单元的值。当(int&)a出现时,它相当于告诉它的上下文:“把这块地址当做整数看待!不要管它原来是什么。”这样,内容0x0000803F按整数解释,其值正好就是1065353216(十进制数)。
通过查看汇编代码可以证实“(int)a相当于重新构造了一个值等于a的整型数”之说,而(int&)的作用则仅仅是表达了一个类型信息,意义在于为cout<<及==选择正确的重载版本。

#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;
int main()
{
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 == static_cast <int&>(a)
(int)&a == reinterpret_cast <int>(&a);

(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

所以输出的是0x00000000

所以前面一个是false,后面一个是true。

http://blog.csdn.net/lvbinandylau/archive/2009/06/25/4298766.aspx

http://blog.csdn.net/mobidogs/article/details/1530775

#c++ && mfc

(int)a和(int)a的区别相关推荐

  1. const int * 、int * const、int const* 、const int a(){ } 和int a()const { }的区别和联系

    前言:很多人都把const int * .int * const.int const* 的区别和联系搞混,我自己在学习C++的过程中,也经常性          弄不 清楚,今天特意总结一下,作为学习 ...

  2. int(1) 和 int(10) 有什么区别?资深开发竟然分不清!

    欢迎关注方志朋的博客,回复"666"获面试宝典 困惑 最近遇到个问题,有个表的要加个user_id字段,user_id字段可能很大,于是我提mysql工单alter table x ...

  3. int(1) 和 int(10) 的区别?很多老程序都理解错了!

    欢迎关注方志朋的博客,回复"666"获面试宝典 最近开发遇到一个问题,涉及到了int(1) 和 int(10) 有什么区别?三年老开发也不知道,于是自己上网 google 研究了下 ...

  4. int(1) 和 int(10) 有什么区别?资深开发竟然都理解错了!

    文章来源:https://sourl.cn/ZVQP6t 困 惑 最近遇到个问题,有个表的要加个user_id字段,user_id字段可能很大,于是我提mysql工单alter table xxx A ...

  5. 2020-09-21C++学习笔记之与C语言区别和加强——四种const意义(const int a; int const b; const int *c; int * const d)

    2020-09-21C++学习笔记(const int a; int const b; const int *c; int * const d) 这两天在上课更新晚了. 1.C/C++中的const ...

  6. const int *,const int * const和int const *有什么区别?

    我总是搞砸了如何正确使用<code>const int* , const int * const和int const * . 是否有一组规则定义您可以做什么和不能做什么? 我想知道在分配, ...

  7. 你知道 int(1) 和 int(10) 的区别吗?

    昨天在群里(点击加群)看到有小伙伴分享了这篇文章,觉得挺不错的.顺手转载一下,一起涨知识! 困惑 最近遇到个问题,有个表的要加个user_id字段,user_id字段可能很大,于是我提mysql工单a ...

  8. mysql int(3)与int(11)的区别

    总结,int(M) zerofill,加上zerofill后M才表现出有点点效果,比如 int(3) zerofill,你插入到数据库里的是10,则实际插入为010,也就是在前面补充加了一个0.如果i ...

  9. mysql int(3)与int(11)的区别详解

    这篇文章主要介绍了mysql int(3)与int(11)的区别详解的相关资料,需要的朋友可以参考下 mysql int(3)与int(11)的区别 总结,int(M) zerofill,加上zero ...

最新文章

  1. 非计算机专业的人要如何学python?
  2. Linux 应用层的时间编程【转】
  3. 9、MySQL系统变量(查看和修改)
  4. Discuz网警过滤关键词库
  5. 三张图较为好理解JavaScript的原型对象与原型链
  6. Swing-文本输入组件(一)
  7. Shell脚本-tr 将大写字母变为小写
  8. Oracle脚本(三)
  9. TCP端口扫描[Python3.5]
  10. 写一个小程序实现win系统定时锁屏
  11. 人工智能语音实训平台实验指导书
  12. VNC 远程中标麒麟桌面版
  13. 机器学习Sklearn Day1
  14. 神经网络与深度学习三:编写单隐层神经网络
  15. ps图文教程:ps钢笔工具在哪里
  16. 7、大话设计模式--状态模式 、适配器模式、备忘录模式、组合模式、迭代器模式
  17. POI Excel行高设置
  18. oracle篮球,篮球小王子!任嘉伦打篮球也不来赖,超爱11号
  19. java 文件路径读取,java中依据路径读取文件
  20. Paxos - 分布式表决算法

热门文章

  1. Leetcode 169. 求众数 解题思路及C++实现
  2. 怎么写显示商品图片_shopee商品描述怎么写,shopee商品排名靠前的是
  3. python引用文件的方法_[项目实践] python文件路径引用的
  4. Oracle 数据库修改配置文件sga_target参数的值,sga_target值太小导致数据库服务起不来问题解决,调大sga_target参数方法
  5. JavaScript 技术篇-js语句创建dom节点,并给节点设置属性
  6. Python 技巧篇-如何避免python报错导致强制关闭窗口
  7. Excel 技术篇-解决“单元格不能自动适应大小“问题
  8. SVD理论以及Python实现
  9. 【Kaggle-MNIST之路】自定义程序结构(七)
  10. 【解决方案】VMWare拖动窗口后有黑色边框(分辨率自适应问题)