强制类型转换(int)、(int&)和(int*)的区别

本文深入探讨了浮点数(float)在计算机内存中的存储格式,以及如何通过(int)与(int&)操作符进行浮点数到整数的转换。详细解析了float类型1.75在内存中是如何被表示的,并解释了为何(float)转换为(int)与直接读取内存值(int&)的结果不同。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载:https://blog.youkuaiyun.com/yesyes120/article/details/79513719

我们先来看两行代码:

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(全零)。

十进制转换成二进制遵循:"乘2取整,顺序排列"法

十进制小数转二进制
  如:0.625=(0.101)B
  0.625*2=1.25======取出整数部分1
  0.25*2=0.5========取出整数部分0
  0.5*2=1==========取出整数部分1

参考文章:http://whudongyang.iteye.com/blog/1208120

总结:

其实,(int&)a就是*(int*)(&a)

  1. 首先对float型变量取地址
  2. 强制类型转换为整型变量的地址(地址的值并没有变)
  3. 将该地址指向的变量输出(但是由于整型和浮点型数据存储方式的不同,输出结果是不同的)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值