目录
前言
新年的第一篇博客,记录一下新一年的学习8。
大家都知道数据在计算机中是用二进制进行存储的,一个字节由8位二进制数组成。那数据在C语言存储的细节是怎么样的呢?这篇文章就带大家讨论这个问题。
一.C语言的基本数据类型介绍
1.1整形家族
在windows64位系统中,long long 占8个字节,long占4个字节,int占4个字节,short占2个字节,char占1个字节。
为什么要把char归入整形家族呢?因为字符数据在c语言中本质储存的ASCII码,而ASCII码是整数,所以存储方式与整数一致。
1.2浮点型家族
在windows64位系统中,float占4个字节,double占8个字节。
1.3指针类型
指针类型(当然指针类型不只这些,这里没有列举完) ,在64位系统下占8个字节,32位系统下占4个字节。
1.4构造类型
这些类型的存储要根据内部的数据类型计算,这里就不做详细描述
1.5空类型void
void表示无类型(空类型)。
二.整形在内存中的存储
2.1原码,反码,补码
什么是原码呢?
原码就是整数直接转换成二进制后形成的二进制序列。如下图所示。
因为a是int类型,int类型由4个字节组成,所以它转换成二进制后的源码应该由32位二进制组成。
在C语言的规定中,正整数的原码、反码、补码是相同的。
PS:它是怎么知道正负的呢?在c语言中,数据的原码首位字符代表正负(0为正,-1为负)。
看完了正数的原反补,现在我们来看负数。
负数的原码与整数一样,都是由数字转化为二进制得到,与正数不同的是,它的第一位是1,也就是符号位为1。
它的反码怎么得来呢?
负数的反码由原码转化而来,规则是:符号位不变,其他位依次按位取反得到。补码则是反码加一得到。
但是数据中为什么要存在原码、反码、补码呢?
我们也可以验证一下,我这里查看的是VS2022中的内存存储。
但是我们看到内存存储的顺序又存在一些问题,它好像是倒着存储的。
这又是什么原因呢?
2.2大小端的介绍
什么是大小端:
PS:0x就是十六进制的意思。
这里我们可以看到数据的存储是倒着存的。
这里的11是低位数据存在低地址处,44是高位数据存在高地址处。
便于记忆可以简单的理解为,小端是倒着存,大端是正着存。
三. 浮点数的存储
3.1举一个例子
为什么会出现这样的情况呢?
3.2浮点数存储规则
IEEE 754对有效数字M和指数E,还有一些特别规定
因为在浮点数中M永远都是大于等于1小于2的,所以E最前面的1没有必要存储,这样可以多一位精度。
如果E为全一为无穷大(正无穷与负无穷),如果E为全0代表无穷小(无限接近于0)
如果E中有1也有0,那就正常计算即可。
3.3解释例题
四.结语:
数据的存储就讲完了,如果有哪里讲的不严谨,欢迎大家来讨论。