C语言中float如何存储?(转载)
float 内存如何存储的
|
类型 |
存储位数 |
总位数 |
偏移值 |
||
|
数符(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如何存储?(转载)的更多相关文章
- C语言中float如何存储?
float 内存如何存储的 类型 存储位数 总位数 偏移值 (offset) 数符(S) 阶码(E) 尾数(M) 短实数(float) 1 8 23 32 127 长实数(double) 1 11 5 ...
- C语言中float,double类型,在内存中的结构(存储方式)
C语言中float,double类型,在内存中的结构(存储方式)从存储结构和算法上来讲,double和float是一样的,不一样的地方仅仅是float是32位的,double是64位的,所以doubl ...
- c语言中float、double、long double在内存中存储方式
存储格式中的二机制转为浮点数: 浮点型变量在计算机内存中占用4个字节(4 Byte),即32-bit,一个浮点数由2部分组成:底数m 和 指数e: 底数部分:使用2进制数来表示此浮点数的实际值: 指 ...
- C语言中 Float 数据结构的存储计算
1.了解float存储结构 float存储结构请看另一篇文章http://blog.csdn.net/whzhaochao/article/details/12885875 2.float最大值 fl ...
- 汇编语言中PTR的含义(转载)
mov ax,bx ;是把BX寄存器“里”的值赋予AX,由于二者都是word型,所以没有必要加“WORD” mov ax,word ptr [bx];是把内存地址等于“BX寄存器的值”的地方所存放的数 ...
- C语言中static修饰符的意义
在C语言中,static通常有2种含义:1)定义变量的生命周期:2)定义变量或者函数的作用域. 变量的生命周期是指,相对于程序运行的进程生命周期,变量存在的时间段.变量的生命周期由变量的存储类型(位置 ...
- Java语言中:float、double数据类型在内存中是如何存储的
引用参考 https://www.cnblogs.com/chenmingjun/p/8415464.html#4291528 https://blog.csdn.net/yansmile1/arti ...
- C语言中file文件指针概念及其操作 (转载)
文件 文件的基本概念 所谓"文件"是指一组相关数据的有序集合. 这个数据集有一个名称,叫做文件名.实际上在前面的各章中我们已经多次使用了文件,例如源程序文件.目标文件.可执行文件. ...
- C语言中do...while(0)的妙用(转载)
转载来自:C语言中do...while(0)的妙用,感谢分享. 在linux内核代码中,经常看到do...while(0)的宏,do...while(0)有很多作用,下面举出几个: 1.避免goto语 ...
随机推荐
- Spring Junit测试(非web,即不包含Controller测试)
使用Spring-Test对Spring框架进行单元测试 配置过程: lib加入导入spring-test.jar和junit包 或者使用Maven依赖: <dependency> < ...
- 使用:/usr/bin/phpize 报错
使用:/usr/bin/phpize 出现下面错误提示 Can't find PHP headers in /usr/include/php The php-devel package is requ ...
- javascript之常用正则表达式
一.校验数字的表达式 1 数字:^[0-9]*$ 2 n位的数字:^\d{n}$ 3 至少n位的数字:^\d{n,}$ 4 m-n位的数字:^\d{m,n}$ 5 零和非零开头的数字:^(0|[1-9 ...
- Windows 10 取消桌面右键“图像属性”、“图像选项”
Windows 10 取消桌面右键"图像属性"."图像选项" 桌面右键 说明:在windows 10中,桌面右键出现"图像属性"." ...
- Linux命令行环境与桌面环境护切换
1.前言 在大部分情况下,我们在使用Linux时习惯使用命令行环境,但是有时候也还是会使用到安装桌面环境,所以在这里介绍一下如何给没有安装桌面环境的系统安装桌面环境.以Centos 6.5 为例演示一 ...
- PPPOE+FREERADIUS+MYSQL+LINUX
环境: OS:Linux Centos 6.9 x86_x64 PPPOE : ppp-2.4.7.tar.gz rp-pppoe-3.12.tar.gz FreeRadius : V3.0.X ...
- IDA逆向:结构体的逆向
源代码: int _tmain(int argc, _TCHAR* argv[]) { struct v1 { int a; short b; char c; int d; double e; }; ...
- java Vamei快速教程21 事件响应
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在GUI中,我们看到了如何用图形树来组织一个图形界面.然而,这样的图形界面是静态的 ...
- window.onload中调用函数报错的问题
今天练习js,忽然遇到了一个问题,就是window.onload加载完成后,调用其中的函数会报错, 上一段简单的代码: 报错信息: 报错原因: 当window.onload加载完成后,第一个alert ...
- python剑指offer 包含min函数的栈
题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)). # -*- coding:utf-8 -*- class Solution: def ...