C/C++教程

【C语言】数据的存储 希望帮到大家哟~~~

本文主要是介绍【C语言】数据的存储 希望帮到大家哟~~~,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

目录

数据类型

类型的基本分类

整形在内存中的存储:原码 反码 补码

内存中大小端存储模式

浮点型

深度剖析浮点型的存储方式

补充


数据类型

char 字符数据类型

short 短整型

int 整型

long 长整型

long long 更长的整型

float 单精度浮点型

double 双精度浮点型

所占内存空间大小:

(编译器为VS2019)

类型的基本分类

 

 这里需要注意的是char到底是unsigned char 还是 signed char 取决于编译器,其余的不加unsigned都默认为signed类型。

注:unsigned:无符号类型   signed:有符号类型  二进制最高位为符号位 

 

 空类型

void表示空类型

void 通常用于函数的返回类型 ,指针类型 ,  函数的参数 

整形在内存中的存储:原码 反码 补码

整形在内存中存储的是补码

原因: 补码可以统一处理符号位和数值域,同时还可以统一处理加法和减法运算(CPU只有加法器),且补码和原码相互转换的过程,其运算过程相同,不需要额外的硬件电路

对于有符号类型来说:最高位表示符号位  0代表正  1代表负

正整数:

原码反码补码相同

负整数:

原码:将数字用二进制表示

反码:原码中的符号位不变,其他位按位取反可得反码

补码:反码+1

(以上所说均为有符号类型)

注:存储的是补码,打印的是原码

      

内存中大小端存储模式

大端存储:数据的低位存储到高地址处,数据的高位存储到低地址处

小端存储:数据的低位存储到低地址处,数据的高位存储高地址处

在内存中 从左向右,地址由低到高

 

浮点型

float        单精度浮点型

double    双精度浮点型(更加精确)

深度剖析浮点型的存储方式

(-1)^S * M * 2^E

S:符号位  0代表正数 1代表负数

M:有效数字 , 大于等于1小于等于2

E:指数位

对于M的存储: 

我们知道M的取值范围为  M>=1&&M< 2  所以肯定是1.xxxxxx,为此我们可以省略保存1的空间全部保存小数点后的数字,这样可以存储更大的数字,更加的节省空间

对于E的存储:

E为无符号类型整数  因此E如果为8位取值范围是0~255  如果为11位 取值范围是0~2047

但是  考虑到E可能为负数  例如:0.5   E为 -1   因此 存入E的真实值之前需要加上一个中间数 

E位8位时,这个中间数为127; E为11位时,这个中间数为1023

例如:

0.5 // 二进制  0.1  ( 2^(-1) = 0.5 )

(-1)^0 * 1.0 * 2^( -1 )

S = 0 ;  E = -1 + 127 = 126 ; M = 1.0

0  01111110  00000000000000000000000

从内存中把E取出有以下三种情况

①E不全为0也不全为1

E先减去127得到真实值,然后再加上有效数字M前第一位的1

②E为全0

此时 1-127 即为E的真实值,而且还原M时不再填补第一位的1,而是写成0.xxxxx的形式,

因为2^(-126)是非常小的数字,无限趋近于0

③E为全1(此时E = 255)

这时,如果有效数字M全为0,表示±无穷大(正负取决于符号位s)

即便M不全为0,2^255 * 1.xxxxx的值也是一个很大的数字

补充

浮点数存储会出现不精确的情况,因此我们比较浮点数时,例如 计算结果x的值是否等于2.1

判断条件不能写成 x == 2.1我们要把判断条件换成x的值是否在误差范围之间

例如: x - 2.1 > 0.1  ——误差范围是否在0.1之间 这样来判断结果是否相等

这篇关于【C语言】数据的存储 希望帮到大家哟~~~的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!