在指针与函数栈帧两篇文章中,我们反复提及了信息是需要储存的。那它们又到底是如何储存在内存中的呢?
我们知道计算机是只能读懂0/1的,即信息在内存中的储存形式是以特殊0/1的排列组合。而下文将主要从数的储存为代表:
首先,一个小常识:cpu只会加法运算。
其次,在指针一文中,我们知晓每一个数据类型定义一个变量,系统都会分配一个地址,而地址所指向的空间内存是相同的(32位:4字节、64位:8字节)。
然后,由数据对应储存是有限制的,比如,char(1字节)、short(2字节)等等。
最后,依据加法原则,我们会考虑到,当两个或多个不同(相同)数据相加,数据总和可能会超过储存限制而导致数据丢失(数据丢失也可以是转换导致)。
因此,编译器在进行两个或多个不同(相同)数据相加时,会进行数据类型提升。
于是,数的储存大体可分为整型与实型的储存。以 32位:4字节 为代表。
同时,储存方式上会出现两种形式,大端储存与小端储存。
我们习惯大端储存,比如,1520、2634、1651等等。我们由于习惯会知晓左位为大,右位为小。那我们抛去习惯,可不可以,0251、4362、1561等等。其实两者都是正确的,数的使用是看使用者如何去使用。
现在,以我们的习惯为标准,定义右位为小端,左位为大端。
大端储存:数据的小端字节储存在内存的大端字节,数据的大端字节储存在内存的小端字节。
小端储存:数据的小端字节储存在内存的小端字节,数据的大端字节储存在内存的大端字节。
(补充:内存大端为低地址,内存小端为高地址)
对于整型数据,有三种储存形式,原码,反码,补码。
由于符号位的存在,如果原码储存,0会有多种储存;如果反码储存,0会有两种储存;如果反码储存,0只有一种储存。
因此,补码成为内存储存数据的唯一方式。
对于实型数据,满足IEEE 754标准,这里就不过多讨论了。
同理,浮点数也满足补码储存。