APP下载

数据在计算机内存中的存储形式及实验验证

2018-06-05李瑞

科教导刊·电子版 2018年2期
关键词:存储单元数据内存

李瑞

摘 要 对于现实生活中我们所接触到的数据类型,在计算机中均是通过二进制的形式,进行存储和计算的。对于计算机专业的学生,首先需要理解和掌握的就是各种数据类型在计算机中的存储形式和处理方式,从而实现更好的掌握计算机底层的工作原理以及数据处理的各种机制。本文简要的对相关内容进行的介绍,并通过C语言进行了计算、验证。

关键词 数据 内存 存储单元 小端存储

中图分类号:TP391.41 文獻标识码:A

1数值型数据在计算机中的存储

1.1存储概述

现将C语言作为例子,其所有的基本数据类型,均是符合人类世界和自然世界的逻辑进行设计的。在计算机中,并没有int、float等等类型,均是以0和1 进行表示和描述的,所有的数据也是通过0和1在计算机中进行存储的。

理解数据的存储,最根本的问题是要了解二进制,即计算机中数据存储的最基本形式。

进制,通俗讲是规定的进位的方法,对于任何一种的进制—X进制,均是表示逢X进一位,例如十进制是逢十进一,八进制是逢八进一,二进制是逢二进1一等等。对于不同的数据,有以下方面的共同之处:(1)每一种进制都有各自的符号集,例如二进制的基本符号是0和1,十进制的基本符号是0,1,2,3,4,5,6,7,8,9等等;(2)对于每一种进制,均使用位置表示法,也就是说在在不同位置的数,其代表的值有所不同,例如,对于十进制数1234.55,可以表示为:1234.55 = 1*10^3+2*10^2+3*10^1+4*10^0+5*10^(-1)+5*10^(-2)。对于任何一种进制的数值,均可以按照不同的权值进行展开。

在人类的思维模式中,十进制是普遍的使用方式,计算机是使用二进制的,编程人员则需要与计算器直接进行交流。举个例子,现给一串二进制数“0000 1010 1111 0101 1000 1111 1111 1111”,任何人看到都会不知所云,如果直接使用十进制,则不能准确的表达计算机的思维方式,因此出现了八进制和十六进制,十六进制应用的更加广泛一些,对于前文中提到的二进制数,转换成八进制,32./3余2,则还需要在前面加0,但是转换成十六进制,32/4=8,可以直接写成十六进制对应的八个数值代表的字符串,更加的简单和明了。

1.2整数在计算机中的存储方式

在32位的计算机系统中,对于整数的范围是指,也即是说-2147483648~ +2147483647。

对于整数的原码,是通过二进制的形式表现的,二进制的最高位是符号位,对于正数,符号位是0,对于负数,符号位是1。数值X的原码记为[X]原,如果在计算机中的表示长度为n,最高位表示符号位,其余位表示数值的绝对值。原码在计算正数与正数的时候,不存在问题,但是出现负数的时候,则会出现问题。

数值X的反码记作[X]反,如果在计算机中的表示长度为n,最高位表示符号位,正数的反码与原码相同,负数的反码是原码的绝对值按位取反得到。

数值X的补码记为[X]补,如果在计算机中的表示长度为n,最高位表示符号位,正数的补码与原码、反码相同,负数的补码是其反码的末尾加1。在计算机中表达带符号的整数时,一般均采用补码,补码的引入,符号位不再约束计算,补码的最高位虽然是1,但是不再是符号位,而是普通的二进制位,可以参与运算。

举个例子,对于+70和-70,其在32位的计算机系统中,其原码分别表示为:

[+70] 原码 = 0000 0000 0000 0000 0000 0000 0100 0110,

[-70] 原码 = 1000 0000 0000 0000 0000 0000 0100 0110。

对于整数0,其原码有以下两个:

[+0] 原码 = 0000 0000 0000 0000 0000 0000 0000 0000,

[-0] 原码 = 1000 0000 0000 0000 0000 0000 0000 0000。

而对于整型类型的数,其在计算机内存中是以补码的方式进行存储的。正数的补码就是自己的原码,而对于负数,其补码是符号位之外的各位取反之后再加1。举个例子,在32位的计算机系统中,+70和-70的补码可以分别表示为:

[+70] 补码 = 0000 0000 0000 0000 0000 0000 0100 0110 = 0x46,

[-70] 补码 = 1000 0000 0000 0000 0000 0000 1011 1010 = 0xffffffba。

通过编写C语言程序,可以验证正属于以及负整数在计算机中是如何存储的,具体的程序设计如下:

﹟include”stdio.h”

main()

{

int i = -70;

printf(“%d在计算机内存储和计算形式为:%x\n”,i,i);

printf(“%d在计算机内存储和计算形式为:%x\n”,-i,-i);

}

在Linux系统中,通过gcc编译器,编译之后的结果显示为:

-70在计算机内存存储和计算形式为:ffffffba

70在计算机内存和计算形式为:46

通过程序语言,直观的显示验证了对于正整数,其在内存中是以原码的形式进行存储的,对于负整数,其在内存中是以补码的形式进行存储的,两者在计算机的内存中都占据了四个单位的存储单元。

1.3小数在计算机内存中的存储

对于实数,其在计算机中的存储形式有浮点型(float)和双精度型(double)两种类型,双精度型的存储空间以及计算精度均要高于浮点型。在IntelCPU架构的系统中,是以小端模式(Little Endian)进行存放的,具体是指低字节存放在低地址,一个存储单元中存储一个字节的内容。对于目前使用的C/C++编译器,其使用的均是EEE定制的标准浮点格式,也就是 我们经常所说的二进制科学表示法,实数S可以表示为S = M * 2N,主要包括三部分内容:符号位、尾数(M)以及阶码(N)。对于浮点型(float)的实数,其存储空间占据了32位的存储单元,其中符号位占据了1位,尾数占据了32位,阶码占据了8位;对于双精度型(double)的实数,其存储空间占据了64位的存储空间,其中符号位占据了1位,尾数占据了52位,阶码占据了11位。

阶码:通过移码进行表示,对于浮点型(float)类型的数据,其规定的偏置量是127,阶码有正值有负值,八位二进制的表示范围是从-128到127;对于双精度型(double)类型的数据,其规定的偏置量是1023,其表示范围是从-1024到1023。对于浮点型类型的数据,假设阶码的真实值是2,加上127,就是 129,相應的阶码是10000001。

尾数:部分的二进制位即小数点后面的二进制位,是有效数字位,规定尾数M的整数部分一直是1,故1不再进行保存。

举个例子,推导浮点型实数125.5,在计算机中是如何进行存储的。首先把125.5转换为二进制的形式,即为1111101.1,因为尾数部分固定是1,所以表示为1.1111011*2^6,故阶码是6,加上127,则是133,对应的二进制表示为10000101,尾数把整数部分的1去掉,则表示为1111011,位数一共是23位,在其后面补0,则表示为11110110000000000000000。因此125.5对应的二进制形式是:

010000101 11110110000000000000000

这在计算机内存中占据了4个单位的内存单元,

可以将浮点数换算为十六进制数,例如将5.2f换算成十六进制数,首先,正数部分5,其四位的二进制数是0101,其次小数部分0.2,对应的二进制数是0.001 1001 1……这里的省略号表示没有办法计算完,是无限循环,因此只取32位,则为:101.001 1001 1001 1001 10011,使用科学计数法表示为:1.01001 1001 1001 1001 10011*22,考虑到偏置量,正数最高位为1,即为0 1000 0001 0100 1100 1100 1100 1100 110,其对应的十六进制是40A66666,这就是5.2的最终整数形式。

同时,还可以将十六进制数转换为浮点数。例如对于十六进制0X40A66666,换算成二进制为0100 0000 1010 0110 0110 0110 0110 0110,最高位是0,所以是正数,接下类的八位换成十进制就是12910,进行逆运算,129 – 127 = 2,指数为2,剩下的23位补1得到:1010 0110 0110 0110 0110 0110,加上小数点得到1.010 0110 0110 0110 0110 0110 * 22,通过科学技术法,得到相应的二进制小数为101.0 0110 0110 0110 0110 011 0,正数部分是5,小数部分进行逆运算,可以表示为0 .0 0110 0110 0110 0110 0110,得到其浮点数是5.1999998。

2非数值型数据在计算机内存中的存储

2.1 ASCⅡ字符

对于标准ASCⅡ字符和扩展ASCⅡ字符,均是一个字节的编码,所以标准ASCⅡ字符和扩展ASCⅡ字符在计算机内存中均是占据了一个单元的存储单元。举个例子,对于字符‘A,其在计算机内存中占据一个单元的存储单元,相应的值是0x41;对于字符‘a,其在计算机内存中占据一个单元的存储单元,相应的值是0x61;对于字符‘$,其在计算机内存中占据一个单元的存储单元,相应的值是0x24。

2.2 汉字

其实,对于任何字符,都可以类似于汉字这样,进行相应的编码,编码方式无论是GB2312,还是UNICODE编码,还是UTF16编码,其在内存中是如何进行存储的,都可以通过这样的方式进行相应的分析和讨论。

3结束语

所有的基本数据类型,均是符合人类世界和自然世界的逻辑进行设计的。在计算机中,并没有int、float等等类型,均是以0和1 进行表示和描述的,所有的数据也是通过0和1在计算机中进行存储的,因此,了解不同类型的数据类型具有十分重要的意义。本文对我们接触到的各种类型的数据,例如正整数、负数、双精度小数、浮点小数、非数值型等等,进行了简单的介绍,概述了其在计算机系统中占据的内存存储空间大小,本文简要的对相关内容进行的介绍,并通过C语言进行了计算、验证。对于计算机专业及想了解相关知识的学生,首先需要理解和掌握的就是各种数据类型在计算机中的存储形式和处理方式,从而实现更好的掌握计算机底层的工作原理以及数据处理的各种机制。通过本文的研究,希望对于计算机专业的学生有一定的借鉴和指导意义。

参考文献

[1] 吴艳婷,方贤进. 数据在计算机内存中的存储形式及实验验证[J].安庆师范学院学报(自然科学版),2016,22(04):152-154.

[2] IKIPEDIA,W.Twos complement [DB/OL]. https : // en . wikipediaorg / wiki / Two % 27s_compkement.

猜你喜欢

存储单元数据内存
一种28 nm工艺下抗单粒子翻转SRAM的12T存储单元设计
外部高速缓存与非易失内存结合的混合内存体系结构特性评测
“春夏秋冬”的内存
一种成本更低的全新静态DRAM存储单元
MiR-125a-5p is Upregulated in Plasma of Residents from An Electronic Waste Recycling Site
浅谈计量自动化系统实现预购电管理应用
基于内存的地理信息访问技术