int_float_double数据类型的存储格式。
一段用来检测编辑器存储方式的程序
//date : 2013/8/16
//designer :pengxiaoen
//function check the C programmable language system #include "stdio.h"
#include "string.h" typedef unsigned char *byte_pointer; void show_bytes(byte_pointer start, int len)
{
int i ;
for(i=;i<len;i++)
printf("%.2x",start[i]);
printf("\n"); system("pause");
} void show_int (int x)
{
show_bytes((byte_pointer)&x, sizeof (int));
} void show_float (float x)
{
show_bytes((byte_pointer)&x, sizeof (float));
} void show_double (double x)
{
show_bytes((byte_pointer)&x, sizeof (double));
} //void show_pointer (void *x)
//{
// show_bytes((byte_pointer)&x, sizeof(void *));
//} int main ()
{
int i=;
int ival;
float fval;
double dval;
// int *ip; ival = i;
// ip = &i;
fval = (float)ival;
dval = (double)ival; show_int (ival);
show_float (fval);
show_double(dval);
// show_point (ip);
}
中间的指针一段不知道为什么我的dev 显示连接错误。所以就先屏蔽掉了。在目前讨论的话题之外,先搁置。
显示的结果
分析: i=12345;转换成十六机制就是 0x3039 说明我这个是个小端机;
好,现在将数据读出来 (00 00 30 39 )16 = (0000 0000 0000 0000 1 0000 0011 1001)2
(46 40 E4 00 )16 = (0100 0110 100 0000 1110 01 000)2
(40 C8 1C 80)16 = (0100 0000 1100 1000 0001 1100 000 0000 ...................)
int float double 存储格式 这本《深入理解计算机系统》第二版 第三十页,突然中止讨论了,下面如果还有再补上。
补充 1: 先看46 40 E4 00
红色部分前面加上一个1就成了12345.
第一个bit为0 表示 数据为正
第一个红色bit 与第一个bit之间的 8个bit 为 100 0110 0 = 140
再看 (00 00 30 39 )16 = (0000 0000 0000 0000 1 0000 0011 1001)2部分
转化成科学计数法 1.1 0000 0011 1001 * 2^13.
因为二进制科学计数法小数点前面一位恒为1,所以就省略存储。只需要存储
1 0000 0011 1001 00 0000 0000。 精确到小数点后的十八位 (2^-18)
存储幂数 13 的位置在第一个bit 也就是符号位,和有效位之间的那8个bit
实际存储时 在原有的幂数基础上加了127 也就是 111 1111 。
最后看 (40 C8 1C 80)16 = (0100 0000 1100 1000 0001 1100 000 0000)2 部分
第一个bit也就是第63个bit 是0 表示是正数
第 62bit 至52bit 100 0000 1100 = 1036 幂数13= 1036-1023
后面的存储格式和float 的相同,只是精度加大了。
而 13 + 127 = 140 所以这8 个bit存储的是140 。至于为什么要加上127。double中为什么要加上一个1023. 这个还么有找到答案。如有幸看到相关资料或者是网友指点迷津,再补充
补充二:
先看下面一个小段的程序
//date : 2013/8/16
//designer :pengxiaoen
//function : check the momery ,how did it to save the number of float #include "stdio.h"
#include "string.h" typedef unsigned char *byte_pointer; int main()
{
int m;
int i ;
float f= 1.0;
byte_pointer bp;
printf("the number is %f\n",f); bp = (byte_pointer)&f;
i = sizeof (f);
for(m=;m<i;m++)
printf("%.2x",bp[m]);
printf("\n"); system("pause");
}
执行结果
如果将第15行进行修改 赋值为-1

好,现在可以分析了
(1)d = (3f 80 00 00 )h = (0011 1111 1000 0000 0000 0000 0000 0000)b
(-1)d = (bf 80 00 00)h = (1011 1111 1000 0000 0000 0000 0000 0000)b
第一个是符号位,上面已经介绍了,不作赘述。011 1111 1 = 127 代表 幂数为0 ,有效位为0
float 类型在存储幂数的时候加上了127 就可以让幂数范围控制在了 -127 ~ 128 之间
double类型类似的将幂数范围控制在 -1023 ~ 1024 之间
综上所述 float 类型存储占用32bit 依次是符号位 第31bit 表示方式 0 表正数 1表示负数
幂 第30bit ~ 23bit 共8bit 表示方式 (100 0000 + 幂数 -1)
小数部分 第22bit ~ 0bit 共23bit 表示方式(小数部分)整数部分为1,默认,不单独存储。
double类型存储占用64bit 依次是符号位 第63bit 表示方式 0 表正数, 1 表示负数
幂 第62bit ~ 52bit 共11bit 表示方式 (1000 0000 000 + 幂数 -1)
小数部分 第51bit ~ 0 bit 共52bit 表示方式(小数部分) 整数部分为1 ,默认,不单独存储。
int_float_double数据类型的存储格式。的更多相关文章
- Hive学习之路 (六)Hive SQL之数据类型和存储格式
一.数据类型 1.基本数据类型 Hive 支持关系型数据中大多数基本数据类型 类型 描述 示例 boolean true/false TRUE tinyint 1字节的有符号整数 -128~127 1 ...
- Apache Hive (六)Hive SQL之数据类型和存储格式
转自:https://www.cnblogs.com/qingyunzong/p/8733924.html 一.数据类型 1.基本数据类型 Hive 支持关系型数据中大多数基本数据类型 类型 描述 示 ...
- 【转】深入分析 Parquet 列式存储格式
Parquet 是面向分析型业务的列式存储格式,由 Twitter 和 Cloudera 合作开发,2015 年 5 月从 Apache 的孵化器里毕业成为 Apache 顶级项目,最新的版本是 1. ...
- 深入分析Parquet列式存储格式【转】
Parquet是面向分析型业务的列式存储格式,由Twitter和Cloudera合作开发,2015年5月从Apache的孵化器里毕业成为Apache顶级项目,最新的版本是1.8.0. 列式存储 列式存 ...
- Parquet列式存储格式
Parquet是面向分析型业务的列式存储格式,由Twitter和Cloudera合作开发,2015年5月从Apache的孵化器里毕业成为Apache顶级项目,最新的版本是1.8.0. 列式存储 列式存 ...
- 深入分析Parquet列式存储格式
Parquet是面向分析型业务的列式存储格式,由Twitter和Cloudera合作开发,2015年5月从Apache的孵化器里毕业成为Apache顶级项目,最新的版本是1.8.0. 列式存储 列式存 ...
- MySQL性能优化总结
一.MySQL的主要适用场景 1.Web网站系统 2.日志记录系统 3.数据仓库系统 4.嵌入式系统 二.MySQL架构图: 三.MySQL存储引擎概述 1)MyISAM存储引擎 MyISAM存储引擎 ...
- MySQL性能优化总结(转)https://yq.aliyun.com/articles/24249
摘要: 一.MySQL的主要适用场景 1.Web网站系统 2.日志记录系统 3.数据仓库系统 4.嵌入式系统 二.MySQL架构图: 三.MySQL存储引擎概述 1)MyISAM存储引擎 MyIS ...
- Hive笔记——技术点汇总
目录 · 概况 · 手工安装 · 引言 · 创建HDFS目录 · 创建元数据库 · 配置文件 · 测试 · 原理 · 架构 · 与关系型数据库对比 · API · WordCount · 命令 · 数 ...
随机推荐
- 修改LVDS支持1024*600分辨率
一.在boot中增加LVDS设置分辨率1024*600选项 1.修改文件TQIMX6_android-4.2.2\bootable\bootloader\uboot-imx\common\cmd_me ...
- MVC-05 Model(1)
在开发应用程序的过程中,经常需要处理许多大大小小的数据,例如,SQL Server数据库存取.连接AD(Active Directory)数据库进行验证.调用外部Web Service取得数据等.除了 ...
- 安装 Rational Rose 启动报错:无法启动此程序,因为计算机中丢失 suite objects.dll
安装完以后提示找不到 suite objects.dll: 经查找,该 dll 存在: 找不到的原因是,安装程序自动设置在 Path 中的环境变量有误: 把最后的 common 改成 Common: ...
- setCentralWidget就可以把Qwidget设置为QMainWindow的主窗口
前面说的return app.exec() 这句话是用来使程序进入事件循环,除了直接递交的事件外,所有的事件都要在这个循环中被一层一层的分发,最后找到相应的处理函数来处理事件. 顶级窗口和顶级窗口是存 ...
- android sdk 下载缓慢的问题
原文地址:http://www.oschina.net/question/265039_173445#tags_nav 1.在Android SDK Manager Setting 窗口设置 HTTP ...
- java.lang.NoSuchMethodError: javax.persistence.OneToMany.orphanRemoval()Z
我现在用的是hibernate3.6final,出现了下面这个异常:(当我使用@ManyToOne时,不会出现异常,而且用@ManyToMany也正常) Caused by: java.lang.No ...
- GLSL中的各种变量总结
1.uint CreateShader(enum type) : 创建空的shader object; type: VERTEX_SHADER, 2.void ShaderSource(uint sh ...
- Ext JS学习第九天 Ext基础之 扩展原生的javascript对象
此文来记录学习笔记: •Ext对于原生的javascript对象进行了一系列的扩展,我们把他们掌握好,更能深刻的体会Ext的架构,从而对我们的web开发更好的服务, 源码位置,我们可以从开发包的这个位 ...
- Compare the value of entity field.
public class Program { static void Main(string[] args) { Program p = new Program(); p.Test(); Consol ...
- SQL 注入与防御实例
注入 1. 创建存储 USE TSQL2012; GO IF OBJECT_ID('Sales.ListCustomersByAddress') IS NOT NULL DROP PROCEDURE ...