浮点数存储方式
作者:互联网
|--浮点数怎么存储在计算机中
浮点型变量是由符号位+阶码位+尾数位组成。
float型数据 二进制为32位,符号位1位,阶码8位,尾数23位
double型数据 二进制为64位,符号位1位,阶码11位,尾数52位
|--单精度32位存储
1bit 8bit 23bit
|--双精度64位存储
1bit 11bit 52bit
浮点数二进制存储形式,是符号位+阶码位+尾数位(针对有符号数)
浮点数没有无符号数(c语言)
|--阶码:
这里阶码采用移码表示,对于float型数据其规定偏置量为127,阶码有正有负,
对于8位二进制,则其表示范围为-128-127,double型规定为1023,其表示范围为-1024-1023
比如对于float型数据,若阶码的真实值为2,则加上127后为129,其阶码表示形式为10000010
|--尾数:
有效数字位,即部分二进制位(小数点后面的二进制位),
因为规定M的整数部分恒为1(有效数字位从左边不是0的第一位算起),所以这个1就不进行存储
|--具体步骤:
把浮点数先化为科学计数法表示形式,eg:1.1111011*2^6,然后取阶码(6)的值加上127(对于float)
计算出阶码,尾数是处小数点后的位数(1111011),如果不够23位,则在后面补0至23位。
最后,符号位+阶码位+尾数位就是其内存中二进制的存储形式
1 eg: 2 #include <stdio.h> 3 #include <stdlib.h> 4 int main(int argc, char *argv[]) 5 { 6 int x = 12; 7 char *q = (char *)&x; 8 float a=125.5; 9 char *p=(char *)&a; 10 11 printf("%d\n", *q); 12 13 printf("%d\n",*p); 14 printf("%d\n",*(p+1)); 15 printf("%d\n",*(p+2)); 16 printf("%d\n",*(p+3)); 17 return 0; 18 } 19 20 output: 21 12 22 0 23 0 24 -5 25 66
|--对于float型:
125.5二进制表示为1111101.1,由于规定尾数的整数部分恒为1,
则表示为1.1111011*2^6,阶码为6,加上127为133,则表示为10000101
而对于尾数将整数部分1去掉,为1111011,在其后面补0使其位数达到23位,
则为11110110000000000000000
内存中的表现形式为:
00000000 低地址
00000000
11111011
01000010 高地址
存储形式为: 00 00 fb 42
依次打印为: 0 0 -5 66
解释下-5,内存中是:11111011,因为是有符号变量所以符号位为1是负数,
所以其真值为符号位不变取反加一,变为:10000101化为十进制为-5.
标签:阶码,存储,方式,符号,尾数,浮点数,float 来源: https://www.cnblogs.com/xuzhaoping/p/10994919.html