C系列总结2 & 剖析整型、浮点型数据在内存中的存储

来源:互联网 发布:淘宝绿松石微信骗 编辑:程序博客网 时间:2024/06/08 15:28

前言:

不积跬步,无以至千里
整型、浮点型变量是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

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


内存的基本结构

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

地址 值 0x001000 01010011(S) 0x001001 01010101(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) 0 0000 0001 0000 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) 0 0000 0000 0000 0000 0000 0000 0001 001

E全为0,我们认为值无限小,规定为0.

原创粉丝点击