c语言中float、double、long double在内存中存储方式
存储格式中的二机制转为浮点数:
浮点型变量在计算机内存中占用4个字节(4 Byte),即32-bit,一个浮点数由2部分组成:底数m 和 指数e;
底数部分:使用2进制数来表示此浮点数的实际值;
指数部分:占用8=bit空间来表示,表示数值范围:0-255;后面介绍 用于存储科学计数法中的指数部分,并且采用移位存储方式;
具体分析:
浮点数据就是按下表的格式存储在4个字节中:
Address+0 Address+1 Address+2 Address+3 Contents
SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM
S部分: 表示浮点数正负,1为负数,0为正数。一位即可
E部分:指数加上127后的值的二进制数(why是加上了127之后的值? 由于指数应可正可负,所以IEEE规定,此处算出的次方须减去127才是真正的指数。所以float的指数可从 -126到128.)
M部分:24-bit的底数(底数部分实际是占用24-bit的一个值,由于其最高位始终为 1 ,所以最高位省去不存储,在存储中只有23-bit。)
特例:浮点数 为0时,指数和底数都为0,但此前的公式不成立。因为2的0次方为1,所以,0是个特例。这个特例也不用认为去干扰,编译器会自动去识别。
举例:看下-12.5在计算机中存储的具体数据:0xC1 0x48 0x00 0x00
二进制:11000001 01001000 00000000 00000000
格式:SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM
可见:
S: 为1,是个负数。
E:(8-bit)为 10000010 转为10进制为130,130-127=3,即实际指数部分为3.
M:(23-bit)为 10010000000000000000000。底数实际上是:1.10010000000000000000000
现在,我们通过指数部分E的值来调整底数部分M的值。
调整方法为:如果指数E为负数,底数的小数点向左移,如果指数E为正数,底数的小数点向右移。小数点移动的位数由指数E的绝对值决定。
这里,E为正3,使用向右移3为即得: 1100.10000000000000000000
转换过程:小数点左边的1100 表示为 (1 × 2^3) + (1 × 2^2) + (0 × 2^1) + (0 × 2^0), 其结果为 12 。
小数点右边的 .100… 表示为 (1 × 2^-1) + (0 × 2^-2) + (0 × 2^-3) + ... ,其结果为.5 。
以上二值的和为12.5, 由于S 为1,使用为负数,即-12.5 。所以,16进制 0XC1480000 是浮点数 -12.5 。
浮点数转存储格式的二进制数:
下面看下如何将一浮点数装换成计算机存储格式中的二进制数。 举例将17.625换算成 float型。
1、转为二进制:10001.101
2、小数点,左移4位,变成1.0001101
3、这样底数为:1.0001101, 指数为:4+127=131,二进制位:1000011
4、符号位为0,因为是正数;
5、合并:0 1000011 0001101后面补0,补成32-bit;
6、转成16进制:转换成16进制:0x41 8D 00 00
浮点数转成二进制代码形式代码:
#include<iostream>
using namespace std; #define uchar unsigned char void binary_print(uchar c)
{
for(int i = ; i < ; ++i)
{
if((c << i) & 0x80)
cout << '';
else cout << '';
}
cout << ' ';
} int main()
{
float a;
uchar c_save[];
uchar i;
void *f;
f = &a; cout<<"pls input a float num:";
for(i=;i!=;i--)
binary_print(c_save[i-]);
cout<<endl; return ;
}
C标准规定,float类型必须至少能表示6位有效数字,就像33.333 333这样的数字的小数点后的前6位;那么whyfloat能表示6位有效数字呢?
解释如下:十进制中的9,在二进制中的表示形式是1001,这也就是说: 表示十进制中的一位数在二进制中需要4bit,所以我们现在float中具有24bit的精度,所以float在十进制中具有24/4=6,所以在十进制里,float能够精确到小数点后6位;
double呢?其实和float原理是一样的,只是double的位数更长一些而已;

注意点,double类型数据操作比float型运算要慢很多;
浮点值的上溢和下溢
假设系统中最大的float值为34E38,并进行如下操作:
float toobig = 3.4E38 * 100.0f ;
printf("%e\n", toobig);
会发生什么呢?这是一个上溢(overflow)的例子。当计算结果是一个大得不能表达的数时,会发生上溢。
相对应的,当表示一个float能表示的最小数时,对这个数进行除2操作,将会发生下溢。
c语言中float、double、long double在内存中存储方式的更多相关文章
- float数据在内存中存储方式
float类型数字在计算机中用4个字节存储.遵循IEEE-754格式标准: 一个浮点数有3部分组成: 符号部分,0 表示正,1表示负. 底数部分 使用二进制数来表示此浮点数的实际值,底数部分实际是占用 ...
- 如何查看float在内存中存储方式
float fla = -1000; unsigned int *pfla = (unsigned int*)&fla; printf("fla=%X\n",*pfla); ...
- C语言中float,double类型,在内存中的结构(存储方式)
C语言中float,double类型,在内存中的结构(存储方式)从存储结构和算法上来讲,double和float是一样的,不一样的地方仅仅是float是32位的,double是64位的,所以doubl ...
- C语言中float如何存储?
float 内存如何存储的 类型 存储位数 总位数 偏移值 (offset) 数符(S) 阶码(E) 尾数(M) 短实数(float) 1 8 23 32 127 长实数(double) 1 11 5 ...
- C语言中float如何存储?(转载)
float 内存如何存储的 类型 存储位数 总位数 偏移值(offset) 数符(S) 阶码(E) 尾数(M) 短实数(float) 1 8 23 32 127 长实数(double) 1 11 52 ...
- C语言中static的作用及C语言中使用静态函数有何好处
转自:http://www.jb51.net/article/74830.htm 在C语言中,static的作用有三条:一是隐藏功能,二是保持持久性功能,三是默认初始化为0. 在C语言中,static ...
- c语言中qsort函数的使用、编程中的一些错误
qsort()函数: 功能:相当于c++sort,具有快排的功能,复杂度的话nlog(n)注:C中的qsort()采用的是快排算法,C++的sort()则是改进的快排算法.两者的时间复杂度都是nlog ...
- C语言中 Float 数据结构的存储计算
1.了解float存储结构 float存储结构请看另一篇文章http://blog.csdn.net/whzhaochao/article/details/12885875 2.float最大值 fl ...
- C语言中 struct成员变量顺序对内存的占用
在C语言的结构体中,是会按照其变量类型来进行分配内存大小的.但是对于不同的编译器,结果是不同的,在VC++6.0中是怎么个分配情况呢?用一下C中的关键字sizeof()来测试下,注意sizeof()不 ...
随机推荐
- Node安装及搭建简单服务器
注:本文安装系统为mac,windows及其他系统下载对应安装包 ,mac下载后的安装包为apk文件,windows为msi文件. 安装 1.在网上下载node安装包,官方网站2.双击下载文件,按步骤 ...
- 关于Unix时间戳
如何在不同编程语言中获取现在的Unix时间戳(Unix timestamp)? Java time JavaScript Math.round(new Date().getTime()/1000)ge ...
- asp.net生成RSS
经常看到博客.还有很多网站中有RSS订阅,今天就来玩玩asp.net生成RSS,在网上查找了相关资料 发现just soso,如下: aspx <?xml version="1.0&q ...
- SVN使用技巧
安装 下载SVN服务端:VisualSVN Server https://www.visualsvn.com/downloads/ 安装,下一步...(更改地址,Location是安装目录,Repos ...
- php中使用curl两个例子
第一个例子: 调用一个天气预告的接口 $data = 'theCityName=石家庄'; $cUrl = curl_init(); curl_setopt($cUrl, CURLOPT_URL, & ...
- read/write拥塞与非拥塞
read/write read函数从打开的设备或文件中读取数据. #include <unistd.h> ssize_t read(int fd, void *buf, size_t co ...
- android自动化(appium)
目录 一.Appium环境搭建 1.下载nodejs,并安装 2.下载appium,并安装 3.安装python.安装pip.安装appium 4.安装java的jdk 5.安装andriod的sdk ...
- Python web框架有哪些
简单易学的web.py, 大型的django:文档最完善.市场占有率最高.招聘职位最多. Tornado 具体看:http://feilong.me/2011/01/talk-about-python ...
- 第三种:NSOperationQueue
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typica ...
- Gradle 1.12 翻译——第十四章. 教程 - 杂七杂八
有关其它已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或訪问:http://gradledoc.qiniudn.com ...