Value = (-1)sign*significand*2*exponet
sign:浮点数在内存中的表示符号的那位数的位数
significand:浮点数的有效数的二进制形式
exponet:浮点数的指数(2的幂)(float 8位double 11位)
规格化:隐含的以1开头的浮点数的二进制表示
举例:
浮点数 内存中的表示 二进制表示 significand exponet
121 00000000 00405E40 (0.1111001*2 6) (0.111001)2 6=1029(40E)-10230.875 00000000 0000EC3F (0.111)2 (0.11)2 -1=1022(3fc)-1023
0.1 99999999 9999b93f (0.000110011[0011])2 (0.10011[0011])2 -4=1019(3fb)-1023
其中在内存中使用的little endian的,所以121 的十六进制表示为0x405e4000 00000000
//下面是用来测试自己设置的0.1的测试程序
#include <iostream.h>
typedef unsigned char * byte_pointer;
void print_byte_double(byte_pointer bptr,int size)
{
int i=0;
for (;i<size;i++)
{
printf("%2x ",bptr[i]);
}
printf("/n");
}
void set_double(byte_pointer bptr,int size)
{
if (size == 4)
{
bptr[0] = 0xcc;
bptr[1] = 0xcc;
bptr[2] = 0xcc;
bptr[3] = 0x3d;
}
else if (size == 8)
{
bptr[0] = 0x99;
bptr[1] = 0x99;
bptr[2] = 0x99;
bptr[3] = 0x99;
bptr[4] = 0x99;
bptr[5] = 0x99;
bptr[6] = 0xB9;
bptr[7] = 0x3F;
}
else
return;
}
int main()
{
double volatile d = (double)0.1;
double volatile* dp = &d;
double volatile dd = d;
float f = 0;
set_double((byte_pointer)&f,sizeof(float));
print_byte_double((byte_pointer)&f,sizeof(float));
printf("dd is %lf",f);
set_double((byte_pointer)&dd,sizeof(double));
print_byte_double((byte_pointer)&dd,sizeof(double));
printf("dd is %lf",dd);
}