【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语言,浮点,希望,原码 来源: https://blog.csdn.net/weixin_55719365/article/details/123235524