C系列总结2 & 剖析整型、浮点型数据在内存中的存储
2017-07-25 14:56
357 查看
前言:
不积跬步,无以至千里整型、浮点型变量是C中经常使用到的基础类型,其中关于其在内存中的具体存储细节在编程书目中鲜有提及,在此做简单总结。
无参考书目
主要参考资料:
计蒜客-“数据科学导论”课程 https://www.jisuanke.com/course/619
以及
Write by 张鹏霄, zpx736312737@126.com
概要:
计算机与二进制由物理特性决定,数值型计算机能够表示0、1
将0、1有规则的放置于以容器中,称之为内存
内存的基本结构
内存的最小单位
内存的具体结构
C/C++常见内置类型及其说明
整型(int)、浮点型(float)等
以int、float为例进一步解释
原码,反码,补码
符号位、指数位、尾数位
计算机与二进制-计算机离散数值存贮介质的基本结构
不用特殊的方法,人用双手只能从1数到10,但使用高低电平表示0、1的数字计算机在同样有限位数能够表达的数的范围可以多的多。每一个用高低电平表示的0或1在计算中称作一个比特(bit),8个比特记为一个字节(byte)
可用以下表格描述2个字节
1bit | 1bit | 1bit | 1bit | 1bit | 1bit | 1bit | 1bit | 1bit | 1bit | 1bit | 1bit | 1bit | 1bit | 1bit | 1bit |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
内存的基本结构
以字节为最小单位,计算机将内存进行编码(小区编门牌号),以char(字符)类型变量为例,我们可以得到地址 | 值 |
---|---|
0x001000 | 01010011(S) |
0x001001 | 01010101(U) |
以C的角度看内存,还将内存分为栈、堆等空间,因本文主要探讨整数、浮点数在内存中的存储,不在此赘述。
C/C++常见内置类型及其说明
一个字节(8bit)不考虑负数仅能表示0~255,我们约定一个int(整型)变量占用4byte,此时计算机能最大能表示2^32-1。综上,我们约定常见内置类型如下
其中
int 占有4byte,首位表示正负,其余位表示数值大小
unsinged [int] 占有4byte,所有比特位表示数值大小
char占有1byte,根据ASCII码值得到对应字符
float占有4byte
double占有8byte(win,c)
其中关于int与float有必要进一步说明
负数与浮点数的进一步说明
int-原码、反码、补码
为什么要有原、反、补码?假设没有以上概念,做运算1+(1)容易,对应1byte下二进制有
00000001 |
00000001 |
00000011 |
00000001 |
11111111 |
经过研究,将原码(本来的二进制值)符号位不变,按位取反得到反码(以-1为例)
10000000 |
10000001 |
作简单总结有:
- 正数的补码与原码一样
- 负数的补码等于原码符号位不变按位取反后再+1,忽视溢出
float-浮点数的存储
浮点数在计算机中以符号位、指数位、尾数位三部分表示。如浮点数3.5,二进制可以看作11.1,化为科学计数法:1.11*2^1;
在计算机中首先取一位置表示符号,其后一部分空间表示尾数(小数点后有效数字),最后一部分表示指数
对3.5用单精度浮点数(4byte)表示
符号位(1bit) | 指数(8bit) | 尾数(23bit) |
---|---|---|
0 | 0000 0001 | 0000 0000 0000 0000 0000 011 |
综上,我们约定有国际标准IEEE,规定任意一个二进制浮点数以以下格式表示
(-1)^S*M*2^E |
元素 | 说明 |
---|---|
(-1)^S | 表示符号位,S=0时表示正数 |
M | 表示有效数字,计算机中舍弃小数点前数字 |
2^E | 科学技术法的指数 |
值得一提的是,1.5可以准确表示为二进制(1.1),但3.14不一定,2^-1=0.5,2^-2=0.25,可能多少个bit位都凑不齐3.14(但无限接近)
此时,双精度浮点数可以更接近最优解。
最后值得强调的是无符号整数E存在一些特殊情况
- 由于E是无符号整数,无法表示负数,则对任意数值加127再存储,如-1寸为126,1存为128
- E值为0,则表示小数无穷小,规定为0
- E全为1,表示小数无穷大
易得,0x00000009转换为浮点数为0
符号位(1bit) | 指数(8bit) | 尾数(23bit) |
---|---|---|
0 | 0000 0000 | 0000 0000 0000 0000 0001 001 |
相关文章推荐
- ※C++随笔※=>☆C++基础☆=>浮点型数据在内存中存储的表示
- memcached源码剖析系列之内存存储机制
- 数据在内存中的存储方式( Big Endian和Little Endian的区别 )(x86系列则采用little endian方式存储数据)
- 浮点型数据在内存中存储的表示
- Memcached源码剖析系列之内存存储机制(一)
- Android数据存储五种方式总结<转载>
- 浮点型数据在内存中存储的表示
- 整型数据在内存中如何存储?
- PHP相关系列 - 使用 PHP 直接在共享内存中存储数据集
- memcached源码剖析系列之内存存储机制(二)
- 浮点型数据在内存中存储的表示
- 浮点型数据在内存中存储样式
- 浮点型数据在内存中的存储【转】
- C系列总结3 & 剖析函数调用及可变参数--详解栈帧
- 浮点型数据在内存中存储的表示[转载]
- Memcached源码剖析系列之内存存储机制(一)
- JAVA 内存管理总结:内存泄露、数据存储、垃圾回收机制一网打尽!
- 浮点型数据在内存中存储的表示
- 华为oj 字符串个数统计&&数字颠倒&&字符串翻转&&字符逆序&&求int型数据在内存中存储时1的个数
- 学习心得——整型数据在内存中如何存储?