按照
IEEE
浮点标准存储浮点数时,一个float
型的值由1
个符号位(最左边的位或最高有效位)、8
个指数位以及23
个小数位依次组成:
0
时表示正数,为1
时表示负数。8
个指数位作为整数理解,可以表达0~255
之间的数,减去127
得到范围-127~128
。-127
和128
分别代表了零和无限大,剩下的-126~127
代表了小数点的位置。-126
是指小数点向左移动126
位,127
是指小数点向右移动127
位。23
个小数位表示了小数点以下的部分,小数部分最左边表示0.5
,即二进制的0.1
;接下来是0.25
,即二进制的0.01
,以此类推。上面说了基本的概念,接下来举个例子:
假如有一个float
型数据,值为25.25
,把这个数转为二进制,就是11001.01
,将这个二进制的整数部分固定为1
,使用科学计数法,等价二进制为1.100101+e4
。按照IEEE
浮点标准,计算机存储这个浮点数,符号位为0
,8
个指数位为131(4+127)
,23
个小数位即100101
后补零,即4849664
(100 1010 0000 0000 0000 0000
)。
准确来讲,小数部分是在二进制表达中,为使得整数部分变为
1
而移动小数点得到的小数部分。
下面使用
C
语言来进行验证:
#include
//下面使用了位域,可以指定结构成员的所占位数(bit)
struct my_float{
unsigned int dot:23; //23位小数部分
unsigned int e:8; //8位指数部分
unsigned int flag:1; //符号位
};
//利用联合的特性,来检验float型数据各部分存储的值
typedef union
{
float a;
struct my_float b;
} bit_32;
int main(){
bit_32 my_var;
my_var.a = 25.25;
printf("dot: %d\ne: %d\nflag: %d\n",
my_var.b.dot, my_var.b.e, my_var.b.flag);
return 0;
}
/*
输出:
dot: 4849664
e: 131
flag: 0
*/
最近看了一些
C
语言书籍,巧合之下,终于弄明白了之前似懂非懂的float
浮点数在计算机的存储,心血来潮,想把我的理解给记录下来,方便日后再读,同时分享给大家,才有了这篇博文,希望可以帮到各位,谢谢!!