一、前言
- 我们在刚开始学习C语言的时候,就接触到了很多数据的不同类型。
- 我们也知道,数据是存储在一块内存空间的,且我们只知道数据的类型决定着,该数据在内存中所占内存空间的大小,
- 且超过一个字节的数据在内存中存储的时候,就有(以字节为单位)存储顺序的问题。
- 可我们更应该知道,数据不仅仅只是存储到指定的空间就完事了,而是不同类型的数据有它相对应的存储原则的。
- 这篇文章就是讲解不同类型的数据是在内容中的存储方式+大小端字节序。
- (本篇文章只对整型家族与浮点型家族对其在内存中的布局进行详解)待更~
二、整型数据在内存的存储
1.如何存储整型数据?
- 整数的二进制表示形式有三种:原码**(整数数据按照二进制的转换后,得到的就是原码)**、反码、补码。
- 而整数在内存中是以补码的形式存储的。
- 这三种表示形式都有符号位与数值位,符号位用'1'表示负,用'0'表示正,而符号位是数值位的最高一位作为符号位。
- 若整数类型是无符号整型,则会把最高位也看成数值位,而把数据默认为正数。且它的反码与补码都等于原码
- 当是有符号的整数时,整数为正时,原码、反码、补码相同。为负的时候,则需要按照下面的运算法则得到补码。
- 原码(整数数据按照二进制的转换后,得到的就是原码);反码(原码,保持符号位不变,其余位按位取反(~)得到反码);补码(反码 + 1得到补码)。
- 补:补码按照同样的运算法则,可以得到原码。
2.补码的意义是什么?
- 补码可以让在内存中存储的整数数据,符号位与数值位统一处理。
- CPU只有加法器,无论进行加法还是减法,两数补码直接相加即可
- 原码转换为补码;补码转换原码,运算法则相同。(符号位不变,数值位按位取反,后+1)
3.如何读取整型数据?
- 整型数据的读取较为简单,怎么存的怎么读出来就行
- 首先,判断该数据类型是否是整型类型
- 其次,判断该整数是signed的整型类型还是unsigned整型类型
- 若为,若为signed的整型类型,且存的整数是负数,需紧记原反补的转换!!!
三、浮点型数据在内存中的存储
1.如何存储浮点型数据(伏笔)
- (-1)^S * M * 2^E
- 任何一个二进制的浮点型数据,都可以用上面的科学计数法表达式来表示;
- S:用于决定该浮点型数据的正负号,S=0时,数据的正负性为正,S=1时,数据的正负性为负。
- M:是一个>1 且 <2的有效数字(我们联想到十进制的科学计数法的有效数字也就能理解到这点)。
- E:是一个指数
- S M E在内存中的布局(下面的的讲解都将以float类型展开,也就是4字节的)
2.如何存储浮点型数据(开始)
- 上面只是介绍了一些有关存储浮点型数据的相关的概念,可这些不足以让我们深入理解到浮点型到底在内存中是如何存储的。
- 存储S数据:
- 很简单,数据是正的,S位上就是0,反之,位1。
- 存储M数据:
- 因为我们都知道M都是一个>1 且 <2的有效数字;
- 为了能让内存得到更高效的利用,在M中的数据存储到内存的时候,都会将M小数点前面的1省去,只保留小数部分。
- 而等我们读取数据的时候,会将M的1再补上去,这样就更高效的利用了一个比特位。
- 存储E数据:
- E是一个无符号整型数据,可是浮点型数据是有正负性之分的,那如何去解决这一难题呢?
- 我们在存储E的数据的时候会加上一个中间值,进行转换,存储到内存中。
- 读取的时候,也会把得到的数据减去这个中间值。
- 中间值是什么?
- 用8比特位存储E数据的时候,其中间值是127(255/2)
- 用11比特位存储E数据的时候,其中间值是1023(2047/2)
- (这里我将举两个例子)
3.如何读取浮点型数据(结尾)
- 只要理解了如何存储浮点型数据,那读取数据就迎刃而解(怎么走的,就怎么回来),但是也有一些特殊的地方,比如对E数据的读取。
- 存储E数据的比特位全为0的时候:(这是一个无限小的数字)
- 这时,浮点数的指数E等于1-127(或者1-1023)即为真实值,有效数字M不再加上第⼀位的1,⽽是还原为0.xxxxxx的⼩数。这样做是为了表⽰±0,以及接近于0的很⼩的数字
- 存储E数据的比特位全为1的时候:(这是一个无限大的数字)
- 这时,如果有效数字M全为0,表⽰±⽆穷⼤(正负取决于符号位s);
- E不全为0或不全为1
- 怎么存E的数据,就怎么读取就行。
四、大小端字节序
1.概念的引出
2.大小端字节序的概念
- 小端字节序存储:
- 高位的数据存储的高地址处;低位的数据存储到低地址处
- 大端字节序存储:
- 高位的数据存储的低地址处;低位的数据存储到高地址处
3.如何判断当前机器的字节序是哪种类型
- 不同平台的是大端字节序的存储,还是小端字节序存储是不一样的,我们能做的就是通过一定的手段获得机器是大端字节序存储,还是小端字节序存储。
- 指针求解:
- 联合体求解: