整数如何转换成浮点数
本文讨论如何将32位int类型整数转换成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无法表示。通过下面的例子也可以验证这一点。
|
|
上述程序将输出:
16777217
16777216.000000