我的编程经历(16)----------数据存储

这一篇章开始简要介绍数据在内存中存储的细节。

首先,数据类型的种类已经很清楚了,如int, char, short等。但是他们也是需要进行基本的归类的。

先是整形家族的归类。

char,注意char虽然是字符类型,单字符类型在存储的时候,存储的是字符的ASCII码值,而ASCII码值是整数,因此也把char归类为整型家族。同时注意char类型本身是不确定是不是有符号的,有没有符号取决于编译器。但至少在VS2013中,char是有符号的char。

short,有符号的short,因此signed short 与short同义,若要定义无符号的short,必须定义为unsigned chort。整型家族的其他成员,如int, long也是同理。

浮点数家族成员较少,只有float 和 double。

构造类型,也叫自定义类型,如数组类型,结构体类型,枚举类型和联合类型。值得注意的是假如有一个数组是int ar[2] = { 0, 0}; 那么它的类型就是int[2],这是可以改变的,因此归为构造类型。

空类型,用于函数参数的返回,若一个函数无需传参无需返回,则可以void test (void)。

之前的篇章中已经着重介绍了整数在内存中的存储方式,涉及到三种表示方法,即源码,补码和反码。正整数的三码相同,而负整数的三码需要简单计算。这么设计是为了便于计算。

因为计算机只有加法计算,而对于减法就是加一个负数,乘法除法就是多加几次多减几次而已。如果正整数与负整数都使用源码进行计算,是会存在问题的。所以使用整数的补码进行运算:

例如要计算3-2的值,对于计算机来说就是计算3 + (-2)的值。

首先3为正整数,三码相同,都为:

00000000,00000000,00000000,00000011

-2为负整数,需要进行计算得出其补码:

源码:10000000,00000000,00000000,00000010

反码:11111111,11111111,11111111,11111101

补码:11111111,11111111,11111111,11111110

然后-2补码与3的补码相加:00000000,00000000,00000000,00000001

由于得到的数符号位为0即为正数,所以源码也为这个数,所以为1。大概就是这样的运算思路。

再来说说大小端,即大小端字节序存储。

当定义一个数组或者一串字符串时,假如是int arr[4] = { 0, 1, 2, 3 };元素字符位由左往右依次降低,也就是说元素0是最高字符位。那在这种情况下,如果字符在内存中的存储是高字符位由低字符位依次存储,就是大端,反之则为小端。可以以代码的形式进行验证:

而浮点型在内存中的存储又是另外一回事。

其存储规则是:任何一个二进制浮点数V都可以表示成:(-1)^S*M*2^E:

其中(-1)^s表示符号位,当s为零时V为正数;当s 为一时V为负数。

M表示有效数字,大于等于一且一定小于二。

2^E表示指数位。

举一个例子5.0,。首先5.0为正数,所以符号位为(-1)^0;5.0小数位是0所以二进制就是101.0然后以科学计数法进行计数,指数就是2,所以M是1.01,指数位就是2^2。所以最后表达式就是(-1)^0*1.01*2^2。

在内存中存储时,若为32位 浮点数,最高位的1位是符号位s,接着的8位是指数位E,剩下的是有效数字M。

对于64位浮点数,符号位一样,后面11位为指数位,其他的是有效数字M。

还有一些需要注意的地方:

M的取值范围是大于或等于1且小于2。也就是说M的值默认第一个一定是1,因此可以被舍弃,只保留小数点后面的几位,舍去一位意味着能多出一位存储小数点后的位数,这样值能更精确。

对于指数E来说,由于指数E是一个无符号整数,这意味着若E为8位,取值为0~255,11位取值范围是0~2047。但在实际操作中指数位是有可能为负数的,入存储0.5的时候。因此,在存储之前需要给指数加上一个中间值,如果是32位,加127,如果是64位这个中间值就是1023。

以上就是存储的过程。而存储后拿去,又会分为三种情况且都跟指数有关:

当指数E不全为1或不全为0时,先将指数的值减去中间值,再将M小数点前的1补齐即可。

举个例子,0.5作为32位浮点数在内存中的存储。首先,它是正整数,所以s = 0, 0.5整数位是零,不足1,所以后移位一个小数点位,再将5转为二进制,得到M 为1.0,然后因为这里向右移了一位,所以指数位以科学记数法的形式移回去,所以E为-1。故整个式子就是:(-1)^0*1.0*2^(-1),然后存储到内存中:

符号位一位为0;

指数就是-1 + 127 = 126的二进制序列:01111110;

M位是1.0小数点后为0,所以后续23位全补位00000000000000000000000;

所以0.5在内存中存储的二进制序列就是0 011111110 00000000000000000000000;

当E全为0时,说明不需要指数,那这时就是无限趋近于0;

当E全为1时则反之,无限趋近于无穷大。以上就是小数在内存中的存储规则

-------------------------------------最后编辑于2023.3.10下午四点左右

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值