当前位置: C语言 -- 专题 -- 整数如何转换成浮点数

整数如何转换成浮点数

本文讨论如何将32int类型整数转换成IEEE float类型的浮点数,以0X1000001为例,其对应的十进制值为16777217

1、将整数改写成二进制的规格化表示形式。

十六进制数:0X1000001

二进制形式为:1 0000 0000 0000 0000 0000 0001

规格化形式为:1.0000 0000 0000 0000 0000 0001×224


2、IEEE float类型表示形式简介,更详细地介绍请参阅专题浮点数

float类型浮点数可以用三个二进制字段来表示,如下所示:

S E T

S为符号字段,占1个位;E为指数字段,占8个位;T为有效字段,占23个位。


3、转换后的浮点数各个字段对应的值。

转换后符号保持不变,0X1000001是正数,转换后的浮点数也是正数,所以S字段的值为0

转换后指数字段的值为127 + 24 = 151,对应的二进制形式为1001 0111,所以E字段的值为1001 0111

T字段的值为整数规格化形式的小数点后的前23位,所以T字段的值为0000 0000 0000 0000 0000 000

对应浮点数的完整表示形式为:

0 1001 0111 0000 0000 0000 0000 0000 000

根据ISO/IEC 9899:2018标准第6.3.1.4 Real floating and integer节,当一个整数类型的值转换成实数浮点类型时,如果转换后的值能够使用新类型准确表示,则转换后的值不会改变;如果转换后的值在新类型的值域范围内,但不能使用新类型准确表示,则结果为最接近的较高或者最接近的较低可表示值,具体由实现定义;如果转换的值超出了浮点类型所能表示的范围,则结果是未定义的。


本例中float类型不能准确表示整数0X1000001,因为其规格化形式中小数点后最后一个1无法表示。通过下面的例子也可以验证这一点。

1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
#include <stdio.h>

int main(void)
{
    printf("%d\n", 0X1000001);
    printf("%f\n", (float)0X1000001);

    return 0;
}

上述程序将输出:

16777217

16777216.000000