我们先来看两行代码:

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*)的区别的更多相关文章

  1. Java中如何使用非强制类型转换把字符串转换成int类型

    ①强制类型转换代码如下: String string = "123456"; int a,b = 0; @Test public void String2Int1() { //方法 ...

  2. 栈和托管堆/值类型和引用类型/强制类型转换/装箱和拆箱[C#]

    原文地址:http://www.cnblogs.com/xy8.cn/articles/1227228.html 一.栈和托管堆      通用类型系统(CTS)区分两种基本类型:值类型和引用类型.它 ...

  3. python 基础之自动类型转换和强制类型转换

    一:自动类型转换 自动类型转换注意针对Number数据类型来说的 当2个不同类型的数据进行运算的时候,默认向更高精度转换 数据类型精度从低到高:bool int float complex #关于bo ...

  4. C#整数三种强制类型转换int、Convert.ToInt32()、int.Parse()、string到object 的区别

    1.int适合简单数据类型之间的转换,C#的默认整型是int32(不支持bool型); 2.int.Parse(string sParameter)是个构造函数,参数类型只支持string类型; 3. ...

  5. c#中convert.toInt32和int.parse()和强制类型转换的区别

    string a="123"; int i=(int)a; 这是会出现错误因为:强制类型转换只能转换值类型不能转换引用类型 string属于引用类型    强制类型转换时如果值类型 ...

  6. C#整数三种强制类型转换int、Convert.ToInt32()、int.Parse()的区别

    1.int适合简单数据类型之间的转换,C#的默认整型是int32(不支持bool型); 2.int.Parse(string sParameter)是个构造函数,参数类型只支持string类型; 3. ...

  7. 转:C#整数三种强制类型转换int、Convert.ToInt32()、int.Parse()的区别

    1.int适合简单数据类型之间的转换,C#的默认整型是int32(不支持bool型); 2.int.Parse(string sParameter)是个构造函数,参数类型只支持string类型; 3. ...

  8. C语言之强制类型转换与指针--#define DIR *((volatile unsigned int *) 0x0022)

    强制类型转换形式:(类型说明符) (表达式) 举例说明:1) int a; a = (int)1.9; 2)char *b; int *p; p = (int *) b; //将b的值强制转换为指向整 ...

  9. int类型和byte类型的强制类型转换

    今天在读<Java网络编程>这本书的第二章 流 时,看到书中有一个地方关于int强制转换为byte类型时应注意的地方.这个地方有点细节,不过就应该把这种细节把握住. 情况是这样的,讲到In ...

随机推荐

  1. 支持通配符查询的k-gram索引

    k-gram索引的通配符查询处理技术称为k-gram索引. 一个k-gram代表由k个字符组成的序列.对于词项castle来说,cas.ast.stl都是3-gram.我们用特殊的字符$来标识词项的开 ...

  2. Unity---协程的简单使用

    1.作用 协程的作用一共有两点: 延时执行代码. 在某项操作完后再执行代码. 就是控制代码在特性的时间执行. 2.协程和线程的区别 协程不是异步,不需要考虑同步和锁问题 线程避免了无意义的调度,提高了 ...

  3. MFS安装

    mfs github地址:https://github.com/moosefs/moosefs 一. 准备 1. 名字解释 Mfsmaster 元数据 Metalogger 元数据备份,用于恢复数据( ...

  4. JS中substr与substring的区别

    js中substr和substring都是截取字符串中子串,非常相近,可以有一个或两个参数. 语法:substr(start [,length]) 第一个字符的索引是0,start必选 length可 ...

  5. react-native-video的使用

    /** * Sample React Native App * https://github.com/facebook/react-native * * @format * @flow */ impo ...

  6. Theme Section

    题目链接 #include <cstdio> #include <iostream> #include <cstring> using namespace std; ...

  7. vue中声明式导航和编程式导航

    官方文档:https://router.vuejs.org/zh-cn/essentials/navigation.html 声明式导航和编程式导航 共同点: 都能进行导航,都可以触发路由,实现组件切 ...

  8. 【aspnetcore】添加自定义json配置文件

    打开program.cs文件,修改CreateWebHostBuilder方法: public static IWebHostBuilder CreateWebHostBuilder(string[] ...

  9. Consul实现服务治理1

    NET Core微服务之基于Consul实现服务治理 https://www.cnblogs.com/edisonchou/p/9148034.html 一.Consul服务注册之配置文件方式 1.1 ...

  10. (转)Mysql数据库之Binlog日志使用总结CentOS 7.x设置自定义开机启动,添加自定义系统服务

    Centos 系统服务脚本目录: /usr/lib/systemd/ 有系统(system)和用户(user)之分, 如需要开机没有登陆情况下就能运行的程序,存在系统服务(system)里,即: li ...