C语言中float如何存储? |
您所在的位置:网站首页 › float型数据如何存储 › 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之前记得让其指向所申请的内存的首地址上。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |