C++ 从float到int

C++ 从float到int

引言

一次在写代码的时候,天真的将一个double强行转换到int,以为能够得到double中的整数部分,结果却得到0。那个时候挺费解,就去查了一下double的存储方式,才发现浮点型的存储方式和int的是大相径庭。整理一下资料,简单介绍一下浮点这种存储方式,希望能够帮助到一些朋友。

 

一、浮点的存储方式

在C++中一个float是32位,一个double是64位,这两种数据类型的存储方式是一样的。所以为了讨论方便,这里就介绍float

先来看看float每一位代表什么意思。


符号位占一位,这个应该不用解释; 阶码位和尾数位,这里我用一个例子来解释:

比如float f = 12.125;

这里我们将这个float拆成两部分12 和 0.125。12转换成二进制就是1100;0.125转换成二进制0.001。所以12.125我们可以这么标识1100.001,然后使用科学计数法表示:

首先来计算阶码,这里的指数为3,然后阶码就是127 + 3 = 130,这里我们为什么加上127,稍后做解释,130转换为二进制便是10000010

然后开始得到尾数,尾数很简单,先获取科学计数法中小数点后面的部分100001,然后将位数补全,因为这里尾数是23位的,所以在100001后面再补上17个0,就是1000010 00000000 00000000

我们整个来看一下这个float(它的符号位位0):

0 10000010 1000010 00000000 00000000

整理一下便是



二、整型的存储方式

整型的存储方式相对来说就简单很多,这里就介绍一下整型是怎么处理负数的。

这里还是举例子说明,比如int i = -1;

这里先不管符号,1(10) = 00000000 00000001(2),对其每一位求反~( 00000000 00000001) = 11111111 11111110。然后再加上1便得到11111111 11111111,这个便是-1用整型方式存储的结果。

所以一个负数,首先去去掉符号,将其转换成二进制,然后对二进制的每一位求反,最后加1。


三、double到int

对于float直接强行转换为int,我在VC++的平台下运行,竟然是正确,估计内部帮忙完成了转换。所以这里我举一个doubleint的例子。

 这里稍微介绍double的存储。


还是12.125,double d = 12.125;举一个例子:

 

符号位:0

阶码位: 1023 + 3 = 1026,注意这里的基数不在是127而是1023。1026(10) = 10000000010(2)10000000010便是阶码位。

尾数位:100001补齐51位

100 00100000 00000000 00000000 00000000 0000000000000000这个尾数位。

下面的代码便是将double转换成int,这个代码后面会进一步改进:

bool ConvertToInt(constdouble & val,int& i)
{
    int num[2] ={0};
    memcpy(num,&val,8);
    int high =num[1];
    int nExp =((high>>20)&0x7ff) - 1023;
    if(nExp<= 20)
    {
        i = ( high&0xfffff |0x100000)>>(20 - nExp);
    }
    else if(nExp > 20 && nExp <= 30)
    {
        int low= num[0];
        i = ( ( high&0xfffff |0x100000)<<(nExp - 20) )+ ( low >>(52 - nExp));
    }
    else
        return false;
 
    if(high&0x80000000)
        i = ~i + 1;
    return true;
}


四、阶码解释

在第一节中,我们计算阶码的时候,我们指数 + 127为什么是127而不是0,这里是因为我们还要考虑指数为负数的情况,比如下面这个情况:

 float f = 0.125;

0.125(10) = 0.001(2) =  这里我们得到的指数是-3,所以阶码是127– 3 = 124。127是八位阶码能够取到的中间值。

 

五、浮点数的范围

这里先介绍一个浮点数的约定,就是下面的三种情况

(1)  阶码位0,尾数位0,那么这个浮点数表示0;

(2)  阶码位255,尾数位0,那么这个浮点表示无穷大;

(3)  阶码位255,尾数位不为0,那么这个是一个非法数。

 

在第一节中介绍的浮点存储结构和上面介绍的三个约定:

其中最大阶码便是254,因为255有特殊作用,所以能够得到的最大指数便是127。

所以浮点型能表示的最大正数是: ,上面这个值约等于:

最小的阶码便是0,所以得到的指数便是-127。所以一个浮点的最小正数应该是,上面这个值约等于:

 

 

©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值