C语言中float如何存储?

float 内存如何存储的

类型

存储位数

总位数

偏移值
(offset)

数符(S)

阶码(E)

尾数(M)

短实数(float)

1

8

23

32

127

长实数(double)

1

11

52

64

1023

N (10) = 123.456,


换算成二进制表示:

N (2) = 1111011.
01110100101111001

= 1. 11101101110100101111001(...) *
2^6

  

那么
E – 127 = 6;  E =
127 + 6 = 133(10) = 10000101(2)

M =
111 0110 1110 1001 0111 1001
(
省略了最高数字位1,
23bit)

  

组合起来就是:

S    
     E         
              M

0  
     10000101 
    111
0110 1110 1001 0111 1001

  
4bit
一间隔:

0100
  0010
  1111 
 0110 
 1110 
 1001 
 0111 
 1001

 4 
   
   
2  
      
 F
   
    
 6  
     
 E  
     
  9  
   
   7 
     
 9

前两天面试某公司时,没有回答上的一个问题,总结如下,以供参考。

问:下面这个结构类型的实例变量占用多少内存:
struct struct1
{
    int i;
    short
j;
    char
c;
};
我反问:是啥语言啥机器啥编译环境?
他回答说:VC6.0下。
我:内存对齐后占8byte。
他又继续问:如何让它只占7byte?
我的第一反应是使用位段,正准备回答,又感觉不对,位段不能让它不对齐啊。又想了几秒钟,还是不会,只好回他说没玩过……

今天下午去图书馆翻了下《代码优化:有效使用内存》,发现里面提到了两种方法:
1
#pragma pack(push)
#pragma pack(1)
struct struct1
{
    int i;
    short
j;
    char
c;
};
#pragma pack(pop)
原来#pragma pack有几种形式,我所接触到的是#pragma pack(n),即变量以n字节对齐。

2
修改编译指令的参数,来禁止内存对齐:
VC++

:/Zn1(VS2005下,右击项目-属性-配置属性-C/C++-代码生成-结构成员对齐-选“1字节(/Zn1):”(即禁止内存对齐),默认是使用默认值,即按照结构中占用空间最大的成员进行对齐。的size进行对齐。
Borland C++
: /-a1

2是对整个项目禁用内存对齐,而法1可以针对特定的结构禁用内存对齐,其提供了更大的灵活性.

另外,该书中还提到:
char不对齐;
short沿偶地址对齐;
int/float沿取值为4的倍数的地址对齐。
double沿取值为8的倍数的地址对齐。

VS2005下,默认是使用默认值,即按照结构中占用空间最大的成员进行对齐,我们可以测试下面这个结构:
struct struct2
{
    char
i;
    short
d;
    double
c;
    short
j;
};

//保持为默认值或修改编译参数/Zn?,猜下sizeof结果为多少?:)
printf("struct2:%d\n",sizeof(struct2));
struct2 st;
printf("%p\n",&st.i);
printf("%p\n",&st.d);
printf("%p\n",&st.c);
printf("%p\n",&st.j);

补充:数据的手工对齐:

char *p;
int temp = align_power-1;
p=(char*)malloc(need_size + temp;
p=(char*)malloc(((int)p+temp)&temp);//修改了p,所以释放p前记得要归位
注:align_power是所需要的对齐幂,char*(也可以为int*)是指针类型。另外,释放p之前记得让其指向所申请的内存的首地址上。

上一篇:iOS 图片加载导致内存警告


下一篇:Eclipse Myeclipse 设定文件的默认打开方式