自学内容网 自学内容网

数据的存储之整型与浮点型数据在内存中的存储方法

目录

前言:

学习数据存储的意义:

本篇博客包含的主要内容介绍:

一、计算机是如何存储数据的

二、整型数据的存储

1、无符号整型(unsigned int)

2、有符号整型(signed int)

3、原码、反码、补码

三、浮点数的存储

1、浮点数存储的基础(二进制形式的科学计数法)

2、单精度浮点型的存储模型

3、双精度浮点型的存储模型

4、浮点数的取出

1.E不全为0或不全为1

2.E全为0

3.E全为1

四、大端字节序与小端字节序

总结:


前言:

学习数据存储的意义:

数据的存储是计算机学习的基础,不管是对程序的编程还是理解,都具有非常重要的内容。数据的存储方式也是我们增强编程“内功”,理解程序“内核”的重要基础。

本篇博客包含的主要内容介绍:

本篇博客,我将对数据的存储中整型与符点型数据的存储进行讲解,其中包含有符整型与无符号整型的存储原、反、补码之间的转换单精度浮点型与双精度浮点型数据的存储大端字节序与小端字节序存储的概念本篇博客内容较多,为了突出重点,本人已对重要部分内容颜色与字体大小、格式等进行突出处理,希望各位可以认真看完。

一、计算机是如何存储数据的

要理解整型和浮点型数据的存储,我们必须先知道计算机是如何存取数据的。计算机不比于人,它是不能直接接收信息的,所有的信息都必须先转换为二进制的数据才能存储到计算机中,所有要想学会整型和浮点型数据的存储,先学会如何计算二进制是非常必要的。对于进制转换,之前的博客已经进行了讲解,这里便不过多赘述。不清楚的同学可以看看我之前的博客。

二、整型数据的存储

相较于浮点数的存储,整型数据的存储是相对简单的,它的数据表示方法和普通的二进制表示是相同的,其中重点要注意的概念便是符号位原码、反码、补码。我们将分成多个部分进行讲解:

1、无符号整型(unsigned int)

无符号整型的核心便是没有符号位,那什么是符号位呢?

符号位便是在一串二进制中为了表示出正负号的区别,便将该串二进制的最高位(最左边的二进制位)用于表示符号的正负。当该二进制位为1时,便表明该数字是负数;当该二进制位为0时,便表明该数字是整数。

正因为它没有符号位,所有无符号整型它是不能直接表示负数的所有当我们使用无符号整型去存储数据时,通常都是去存储没有负数概念的数据。例如当我们去存储年龄时,我们可以用无符号整型的存储方式去存储该数据,因为年龄是不可能为负数的。但是正是由于它不需要使用符号位,它可以比相同位数的有符号整型表示更大的数

2、有符号整型(signed int)

有符号整型采用符号位的方式存储,用于区分数据的正负。以一个8位二进制数据为例:

1 0001010      (二进制原码)

-     10           (对应数字)

红色部分为符号位,黑色部分为数据的数值大小。符号位1表示数字为负数,0001010表示的数是十进制的10。所以这串二进制表示的就是-10。

3、原码、反码、补码

对于正数,它的原码、反码、补码是相同的,例如:数字5的原码、反码、补码都是00000101.

对于负数,它的原码、反码、补码是不同的,对于原码和上面有符号整型的例子描述是一样的,最高位为符号位,剩下的二进制位表示数字大小(它们与普通二进制与十进制的对应是一样的)。

原码、反码、补码之间的转换规则如下:

将二进制原码除符号位不变,其它二进制位“按位取反”(1变为0,0变为1),便得到了反码。若再将反码转换为补码,则在反码的基础上加1.

例如:-5的8位二进制表示

1 0000101  (原码)

1 1111010   (反码)

1 1111011    (补码)

在这里我们要补充一个有趣规律:

当我们在进行补码转为原码的转换时,我们大概会先对补码减1,再取反,这是对转换的倒推,没有错误。但是我们也可以在补码的基础上取反再加1(和原码转补码一样),这样也是可以得到原码的。 我们举一个例子:就拿上面的-5来说吧!

1 1111011  (-5的补码)

1 0000100  (补码取反)

1 00000101 (再加1的到原码)

是不是非常神奇、有趣的规律?你可以分析出它的原理吗?欢迎到评论区进行交流。

三、浮点数的存储

1、浮点数存储的基础(二进制形式的科学计数法)

对于符点数的存储,采用的方法是相对复杂的。

根据国际标准IEEE(电气与电子工程协会)754规定,任何一个二进制浮点数V都可以表示成下面的形式:

(-1)^S*M*2^E  (二进制形式的科学计数法)

1*(-1)^S表示符号位,当S=0时,浮点数V为正数;当S=1时,V为负数。

2*  M表示有效数字,大于等于1,小于2(和我们常见的科学计数法只保留一位整数相同,只是之前我们接触的为十进制而这次是二进制而已)。

3*  2^E表示指数位。

这是进行浮点数存储的基础,浮点数的存储模型也是分成S、M、E三部分 进行存储的。除此之外,浮点数的存储因其的精度不同分为单精度浮点型双精度浮点型

2、单精度浮点型的存储模型

单精度浮点型采用32位二进制进行存储,其中符号位S占1位,指数位E占8位,尾数位M占23位。(图像在单、双精度浮点型存储模型讲解的下方

IEEE754规定,在计算机内部保存M时,默认这个数第一位总为1,因此可以将第一位舍去,只保存后面的部分。比如保存1.101,只有保存101即可。等到读取时,再吧第一位的1加上去。这样做的目的是节省有位的有效数字。

至于指数E,情况就比较复杂了,首先,E为一个无符号整数,这就意味着在单精度浮点数的情况下,它的取值范围为0~255,但是,科学计数法中E是可以为负数的,所以IEEE754规定,存入内存时E的值必须要加上中间数,在单精度浮点型的情况下,这个数为127(2^(8-1)-1=127,E有8位存储空间),有时我们称这为“魔术数”。举一个例子,当E为-3时,便存储124。

3、双精度浮点型的存储模型

双精度浮点型采用64位二进制进行存储,其中符号位S占1位,指数位E占11位M占52位。

对S、E、M的存储和上面的绿色字相似,区别在于E的范围变为了0~2047,中间数变为了1023(2^(11-1)-1=1023,E有11位存储空间)。

 

4、浮点数的取出

 浮点数根据指数E的不同,从内存中取出还可以分成三中情况,我们通常使用第一种,第二、三种因其特殊性被分配表示“无穷”的含有(这种情况我们使用较少可当扩展,也可忽略)。

1.E不全为0或不全为1

这时指数E的计算值减去127(或1023)得到真实值,再将有效数字M前加上第一位的1。

2.E全为0

这时浮点数的指数E等于1-127(或1-1023)即为真实值,有效数字M不再加上第一位的1,而是还原为0.****的小数,这样做是为了表示\pm0(无穷小),以及接近0的很小的数。

3.E全为1

这时,如果有效数字M全为0,表示\pm无穷大(正负取决于符号位)。

四、大端字节序与小端字节序

对于各编辑器来说,它们使用的字节序是不同的,要想深入理解数据的存储模式,先知道当前编辑器的字节序是必不可少的。

大端字节序:把数据的低位字节序的内容存放到高位地址处,高位字节序的内容存放到低地址处。

小端字节序:把数据的高位字节序的内容存放到高位地址处,低位字节序的内容存放到低地址处。

那我们要如何知道当前编辑器的字节序呢?有两种方法:

 1.查看内存。不同编辑器方法不同,以VS为例:在进入调试状态后(F10),点击“调试”->“窗口”->“内存”,即可查看内存了。

2.代码测试。使用特殊测试代码可以测试出当前编辑器的字节序。以C语言代码为例:

#include <stdio.h>
int check_sys()
{
int a = 1;
char* pa = (char*) & a;
return *pa;
}
int main()
{
int ret = check_sys();
if (ret == 1)
{
printf("小端");
}
else
{
printf("大端");
}
return 0;
}

总结:

看到这里的同学,已经对整型数据、浮点型数据、大小端字节序等知识有了了解。若存在错误之处,还请在评论区斧正。

本文全长3000字,耗时2天,创作不宜,看到这里给博主来个三连吧!博主感激不尽!大家的支持是我创作最大的动力。


原文地址:https://blog.csdn.net/gybhh/article/details/142816967

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!