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之前记得让其指向所申请的内存的首地址上。

来自:https://www.cnblogs.com/lsgsanxiao/p/5113442.html

C语言中float如何存储?(转载)的更多相关文章

  1. C语言中float如何存储?

    float 内存如何存储的 类型 存储位数 总位数 偏移值 (offset) 数符(S) 阶码(E) 尾数(M) 短实数(float) 1 8 23 32 127 长实数(double) 1 11 5 ...

  2. C语言中float,double类型,在内存中的结构(存储方式)

    C语言中float,double类型,在内存中的结构(存储方式)从存储结构和算法上来讲,double和float是一样的,不一样的地方仅仅是float是32位的,double是64位的,所以doubl ...

  3. c语言中float、double、long double在内存中存储方式

    存储格式中的二机制转为浮点数: 浮点型变量在计算机内存中占用4个字节(4 Byte),即32-bit,一个浮点数由2部分组成:底数m  和 指数e: 底数部分:使用2进制数来表示此浮点数的实际值: 指 ...

  4. C语言中 Float 数据结构的存储计算

    1.了解float存储结构 float存储结构请看另一篇文章http://blog.csdn.net/whzhaochao/article/details/12885875 2.float最大值 fl ...

  5. 汇编语言中PTR的含义(转载)

    mov ax,bx ;是把BX寄存器“里”的值赋予AX,由于二者都是word型,所以没有必要加“WORD” mov ax,word ptr [bx];是把内存地址等于“BX寄存器的值”的地方所存放的数 ...

  6. C语言中static修饰符的意义

    在C语言中,static通常有2种含义:1)定义变量的生命周期:2)定义变量或者函数的作用域. 变量的生命周期是指,相对于程序运行的进程生命周期,变量存在的时间段.变量的生命周期由变量的存储类型(位置 ...

  7. Java语言中:float、double数据类型在内存中是如何存储的

    引用参考 https://www.cnblogs.com/chenmingjun/p/8415464.html#4291528 https://blog.csdn.net/yansmile1/arti ...

  8. C语言中file文件指针概念及其操作 (转载)

    文件 文件的基本概念 所谓"文件"是指一组相关数据的有序集合. 这个数据集有一个名称,叫做文件名.实际上在前面的各章中我们已经多次使用了文件,例如源程序文件.目标文件.可执行文件. ...

  9. C语言中do...while(0)的妙用(转载)

    转载来自:C语言中do...while(0)的妙用,感谢分享. 在linux内核代码中,经常看到do...while(0)的宏,do...while(0)有很多作用,下面举出几个: 1.避免goto语 ...

随机推荐

  1. label+input实现按钮开关切换效果

    label+input实现按钮开关切换效果 <!DOCTYPE html> <html lang="en"> <head> <meta c ...

  2. css3动画-加载中...

    写几个简单的加载中动画吧. 像前面三种都是相当于几个不同的点轮流来播放同一动画:变大变小.css3里面有一个用于尺度变换的方法:scale(x,y):定义 2D 缩放转换,改变元素的宽度和高度. 第四 ...

  3. Spring IoC和AOP的介绍

    基于Spring Framework 版本:5.0.2.RELEASE IoC 概念:传统Java开发中,程序通过new主动创建对象实例,而Spring有专门的IoC容器来创建对象,具体来说就是在Sp ...

  4. cms-详细页面2

    详细页面遗留下来的部分: 1:当前位置 2.分享 3.时间格式 4.摘要 5.关键字: 解决方案: 1:当前位置:---后台拼接 2:分享:前端一段js代码 3.摘要,直接数据库查询 4.时间格式:引 ...

  5. iOS开发资料

    https://github.com/XCGit/awesome-objc-frameworks https://github.com/KevinHM/ios-good-practices-the-l ...

  6. 2018.5.21 . XMLSpy激活的方法

    127.0.0.1 altova.com #XMLspy 127.0.0.1 www.altova.com #XMLspy 127.0.0.1 link.altova.com #XMLspy 追加加到 ...

  7. php xdebug扩展无法进入断点问题

    Waiting for incoming connection with ide key 看到这句话就恶心 这两天搞php运行环境搞的头大,好在现在终于调通了,可以正常进入断点了 现在记录一下,避免下 ...

  8. {"errmsg":"invalid weapp pagepath hint: [IunP8a07243949]","errcode":40165}微信的坑

    使用微信官方文档,发送请求会报错--   pagepath无效! 正确修改-- 将标红的pagepath改成 page与上面相同即可

  9. JSP出现"属性值[request.getParameter("myMessage")]引用["],在值内使用时必须被转义"的解决方法

    写JSP时出现属性值[request.getParameter("myMessage")]引用["],在值内使用时必须被转义. 源代码: <jsp:setPrope ...

  10. Zabbix监控oracle各服务器连接数

    需求: 根据机器名查询oracle连接数,并通过zabbix进行监控 脚本: [root@rac1 Zabbix_S]# cat get_conns.py#!/usr/bin/python#codin ...