强制类型转换(int)、(int&)和(int*)的区别
我们先来看两行代码:
float x=1.75,y=1.75;
cout<<(int)x<<" "<<(int&)y<<endl;
输出为:1 1071644672
首先呢,我们来看一下浮点数的格式:
float是单精度32位,所以呢:
- 符号位 (Sign):0代表正数,1代表为负数;
- 指数位 (Exponent):用于存储科学计数法中的指数数据,指数的数值要加上127,如果指数本来是3,那么要换成130来存储;
- 尾数部分 (Mantissa):采用移位存储尾数部分,因为M的值一定是1<= M <2,所以它绝对可以写成1.xxxxxxx的形式,所以规定M在存储时舍去第一个1,只存储小数点之后的数字,这样做节省了空间。举例子:
用二进制的科学计数法表示 1000.1,可以表示为1.0001 * 23
用二进制的科学计数法表示 1110110.1,可以表示为1.1101101 * 26
任何一个数的科学计数法表示都为1. xxx * 2n ,尾数部分就可以表示为xxxx,由于第一位都是1嘛,干嘛还要表示呀?所以将小数点前面的1省略。
举个例子,浮点数-3.75,先将其转换成2进制的,则为-11.11,可以写成-1.111*2^1,所以符号位是1,加127等于128,指数位是1000 0000,尾数位是111 0000 0000 0000 0000 0000(就是3个1,然后后面20个0,一共23位)。
11000 0000 111 0000 0000 0000 0000 0000
那么1.75呢?1.75写成二进制就是1.11*2^0,所以符号位是0,指数位0+127=127,是0111 1111,尾数位是110 0000 0000 0000 0000 0000(2个1,后面21个0,一共23位),把这几部分写在一起就是:
0011 1111 1110 0000 0000 0000 0000 0000
这个浮点数,在内存里存储的格式就是这样。如果我们把它当做整数来读取,那会是多少呢?
输出为:1071644672
是不是感觉很巧啊,哈哈,发现点什么了嘛?
(int)x 强制类型转换,是将浮点数x为参数构造整数(即float转换为int)
(int &)y 则是告诉编译器将y看成int对待(内存里的数据不做任何转换),所以(int &)x值为1071 644 672。
至于(int*)的话,我就不多说啦,就是强制转换成整型指针,一般人们容易混淆的是(int)和(int&)这两个。
补充:浮点数0.0是比较特殊的,它并不按照上面说的浮点数的格式存储,浮点数0.0在内存里的存储是000.....000(全零)。
强制类型转换(int)、(int&)和(int*)的区别的更多相关文章
- Java中如何使用非强制类型转换把字符串转换成int类型
①强制类型转换代码如下: String string = "123456"; int a,b = 0; @Test public void String2Int1() { //方法 ...
- 栈和托管堆/值类型和引用类型/强制类型转换/装箱和拆箱[C#]
原文地址:http://www.cnblogs.com/xy8.cn/articles/1227228.html 一.栈和托管堆 通用类型系统(CTS)区分两种基本类型:值类型和引用类型.它 ...
- python 基础之自动类型转换和强制类型转换
一:自动类型转换 自动类型转换注意针对Number数据类型来说的 当2个不同类型的数据进行运算的时候,默认向更高精度转换 数据类型精度从低到高:bool int float complex #关于bo ...
- C#整数三种强制类型转换int、Convert.ToInt32()、int.Parse()、string到object 的区别
1.int适合简单数据类型之间的转换,C#的默认整型是int32(不支持bool型); 2.int.Parse(string sParameter)是个构造函数,参数类型只支持string类型; 3. ...
- c#中convert.toInt32和int.parse()和强制类型转换的区别
string a="123"; int i=(int)a; 这是会出现错误因为:强制类型转换只能转换值类型不能转换引用类型 string属于引用类型 强制类型转换时如果值类型 ...
- C#整数三种强制类型转换int、Convert.ToInt32()、int.Parse()的区别
1.int适合简单数据类型之间的转换,C#的默认整型是int32(不支持bool型); 2.int.Parse(string sParameter)是个构造函数,参数类型只支持string类型; 3. ...
- 转:C#整数三种强制类型转换int、Convert.ToInt32()、int.Parse()的区别
1.int适合简单数据类型之间的转换,C#的默认整型是int32(不支持bool型); 2.int.Parse(string sParameter)是个构造函数,参数类型只支持string类型; 3. ...
- C语言之强制类型转换与指针--#define DIR *((volatile unsigned int *) 0x0022)
强制类型转换形式:(类型说明符) (表达式) 举例说明:1) int a; a = (int)1.9; 2)char *b; int *p; p = (int *) b; //将b的值强制转换为指向整 ...
- int类型和byte类型的强制类型转换
今天在读<Java网络编程>这本书的第二章 流 时,看到书中有一个地方关于int强制转换为byte类型时应注意的地方.这个地方有点细节,不过就应该把这种细节把握住. 情况是这样的,讲到In ...
随机推荐
- compass初探
1.安装compass: sudo gem install compass 如果你用的是Windows系统,那么要省略前面的sudo. 2.项目初始化 接下来,(首先要进入目标目录.)要创建一个你的C ...
- OAuthLogin2.0
开源第三方登录组件OAuthLogin2.0 支持QQ,阿里巴巴,淘宝,京东,蘑菇街,有赞等平台 Nuget地址:https://www.nuget.org/packages/OAuthLogin ...
- 如何安装使用windows自带的telnet服务
控制面板->程序和功能->打开或关闭Windows功能->Telnet 客户端 [ Telnet 服务器 ] 安装完成后重启cmd telnet ip port
- 洪水 Pow
Description AKD市处在一个四面环山的谷地里.最近一场大暴雨引发了洪水,AKD市全被水淹没了.Blue Mary,AKD市的市长,召集了他的所有顾问(包括你)参加一个紧急会议.经过细致的商 ...
- asp.net重启web应用程序域
我把加载到static静态变量中了,是在数据库中存的,这样每次改了一下必须要重启一下web应用程序,每次去iis操作太麻烦了,于是找的了这个重启的办法,一句话代码: System.Web.HttpRu ...
- Spring Boot自动配置原理与实践(一)
前言 Spring Boot众所周知是为了简化Spring的配置,省去XML的复杂化配置(虽然Spring官方推荐也使用Java配置)采用Java+Annotation方式配置.如下几个问题是我刚开始 ...
- Java 面向对象,封装,继承
1相关概念的理解 1.1面向过程.面向对象 面向过程与面向对象都是编程中,编写程序的一种思维方式. 面向过程的程序设计方式,是遇到一件事时,思考“我该怎么做”,然后一步步实现的过程.(职员思想) 面向 ...
- css实现瀑布流
<style> .container{ column-width:250px; -webkit-column-width:250px; ...
- JavaScript 事件对象event
什么是事件对象? 比如当用户单击某个元素的时候,我们给这个元素注册的事件就会触发,该事件的本质就是一个函数,而该函数的形参接收一个event对象. 注:事件通常与函数结合使用,函数不会在事件发生前被执 ...
- 关于Servlet中的转发和重定项
一:转发 首先转发属于服务器内部行为,通过浏览器的地址栏是看不到URL变化的.比如说客户端发送一个请求到ServletA,ServletA接收到请求,但是没有能力处理,但是ServletA知道Serv ...