(int)a和(int)a的区别
(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
(int)a和(int)a的区别相关推荐
- const int * 、int * const、int const* 、const int a(){ } 和int a()const { }的区别和联系
前言:很多人都把const int * .int * const.int const* 的区别和联系搞混,我自己在学习C++的过程中,也经常性 弄不 清楚,今天特意总结一下,作为学习 ...
- int(1) 和 int(10) 有什么区别?资深开发竟然分不清!
欢迎关注方志朋的博客,回复"666"获面试宝典 困惑 最近遇到个问题,有个表的要加个user_id字段,user_id字段可能很大,于是我提mysql工单alter table x ...
- int(1) 和 int(10) 的区别?很多老程序都理解错了!
欢迎关注方志朋的博客,回复"666"获面试宝典 最近开发遇到一个问题,涉及到了int(1) 和 int(10) 有什么区别?三年老开发也不知道,于是自己上网 google 研究了下 ...
- int(1) 和 int(10) 有什么区别?资深开发竟然都理解错了!
文章来源:https://sourl.cn/ZVQP6t 困 惑 最近遇到个问题,有个表的要加个user_id字段,user_id字段可能很大,于是我提mysql工单alter table xxx A ...
- 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 ...
- const int *,const int * const和int const *有什么区别?
我总是搞砸了如何正确使用<code>const int* , const int * const和int const * . 是否有一组规则定义您可以做什么和不能做什么? 我想知道在分配, ...
- 你知道 int(1) 和 int(10) 的区别吗?
昨天在群里(点击加群)看到有小伙伴分享了这篇文章,觉得挺不错的.顺手转载一下,一起涨知识! 困惑 最近遇到个问题,有个表的要加个user_id字段,user_id字段可能很大,于是我提mysql工单a ...
- mysql int(3)与int(11)的区别
总结,int(M) zerofill,加上zerofill后M才表现出有点点效果,比如 int(3) zerofill,你插入到数据库里的是10,则实际插入为010,也就是在前面补充加了一个0.如果i ...
- mysql int(3)与int(11)的区别详解
这篇文章主要介绍了mysql int(3)与int(11)的区别详解的相关资料,需要的朋友可以参考下 mysql int(3)与int(11)的区别 总结,int(M) zerofill,加上zero ...
最新文章
- 非计算机专业的人要如何学python?
- Linux 应用层的时间编程【转】
- 9、MySQL系统变量(查看和修改)
- Discuz网警过滤关键词库
- 三张图较为好理解JavaScript的原型对象与原型链
- Swing-文本输入组件(一)
- Shell脚本-tr 将大写字母变为小写
- Oracle脚本(三)
- TCP端口扫描[Python3.5]
- 写一个小程序实现win系统定时锁屏
- 人工智能语音实训平台实验指导书
- VNC 远程中标麒麟桌面版
- 机器学习Sklearn Day1
- 神经网络与深度学习三:编写单隐层神经网络
- ps图文教程:ps钢笔工具在哪里
- 7、大话设计模式--状态模式 、适配器模式、备忘录模式、组合模式、迭代器模式
- POI Excel行高设置
- oracle篮球,篮球小王子!任嘉伦打篮球也不来赖,超爱11号
- java 文件路径读取,java中依据路径读取文件
- Paxos - 分布式表决算法
热门文章
- Leetcode 169. 求众数 解题思路及C++实现
- 怎么写显示商品图片_shopee商品描述怎么写,shopee商品排名靠前的是
- python引用文件的方法_[项目实践] python文件路径引用的
- Oracle 数据库修改配置文件sga_target参数的值,sga_target值太小导致数据库服务起不来问题解决,调大sga_target参数方法
- JavaScript 技术篇-js语句创建dom节点,并给节点设置属性
- Python 技巧篇-如何避免python报错导致强制关闭窗口
- Excel 技术篇-解决“单元格不能自动适应大小“问题
- SVD理论以及Python实现
- 【Kaggle-MNIST之路】自定义程序结构(七)
- 【解决方案】VMWare拖动窗口后有黑色边框(分辨率自适应问题)