您的位置:首页 > 编程语言 > C语言/C++

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个字节

1bit1bit1bit1bit1bit1bit1bit1bit1bit1bit1bit1bit1bit1bit1bit1bit
0000001000000010
用二进制可以表示为0000 0001 0000 0001,用十六进制可以表示为0x0101

内存的基本结构

以字节为最小单位,计算机将内存进行编码(小区编门牌号),以char(字符)类型变量为例,我们可以得到

地址
0x00100001010011(S)
0x00100101010101(U)
第一列表示内存的地址的编码(家庭住址),0x表示其为十六进制,第二列为值,根据ASCII码值得到01010011对应字符’S’。

以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
但对1+(-1)

00000001
11111111
计算机很难去做运算。

经过研究,将原码(本来的二进制值)符号位不变,按位取反得到反码(以-1为例)

10000000
反码+1得到补码

10000001
作以上处理后计算机能更方便做计算

作简单总结有:

- 正数的补码与原码一样

- 负数的补码等于原码符号位不变按位取反后再+1,忽视溢出

float-浮点数的存储

浮点数在计算机中以符号位、指数位、尾数位三部分表示。

如浮点数3.5,二进制可以看作11.1,化为科学计数法:1.11*2^1;

在计算机中首先取一位置表示符号,其后一部分空间表示尾数(小数点后有效数字),最后一部分表示指数

对3.5用单精度浮点数(4byte)表示

符号位(1bit)指数(8bit)尾数(23bit)
00000 00010000 0000 0000 0000 0000 011
对双精度浮点数(8byte),则有 符号位(1bit) 指数(11bit) 尾数(52bit)

综上,我们约定有国际标准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)
00000 00000000 0000 0000 0000 0001 001
E全为0,我们认为值无限小,规定为0.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息