【新书推荐】2.4节 数据宽度

本节内容:计算机受制于物理器件的制约,存储或读写数据的宽度是有长度限制的,通常我们使用数据位的位数来表示数据宽度,如8位、16位、32位、64位等。

         ■计算机计数与数学计数的区别:数学中的数据可以是无穷大或无穷小,不受限制。计算机存储或读写的数据必须指定数据宽度。

         ■数据宽度:计算机的数据宽度指存储或读写数据时用数据位表示的宽度。

         ■数据存储范围:表示指定的数据宽度内可以存储数值的范围,如数据宽度为8位,其可存储的正整数据范围是0~28-1。如果存储的数据超过最大宽度,多余的数据将被丢弃,称为数据溢出。

2.4.1 计算机计数与数学计数的区别

数字差异:数学上的数字,是没有大小限制的,可以是无穷大,也可以是无限小。但在计算机中,由于受硬件的制约,数据都是有长度限制的(我们称为数据宽度),超过最大宽度的数据会被丢弃。

例如:给定的一个数0x123456789ABC,如果规定它的宽度为32位(这里指的32位通常是二进制的32位数),那么该数值的有效值为0x56789ABC。如果运算结果超过其宽度将被略去,只保留有效位。

思维上的差异:数学计算记录在纸上,脑袋里或者其他地方,计算机是存储在物理存储器中的,比如寄存器,内存,硬盘等。计算机硬件设备的物理特性决定了数据存储的宽度。

2.4.2 数据宽度

数据宽度的定义:“数据宽度”就是内存存储单元的宽度,代表单个存储单元能存储多少位二进制数。

举例

假设存储单元的数据宽度为4位,意味一个存储单元最多只能存储4个数据位,即4个二进制数0或1。能够存储的二进制数范围如下:

0000  0001   0010   0011   0100   0101  0110   0111 

1000  1001   1010   1011   1100   1101  1110   1111

16进制表示:0~F。

10进制表示:0 ~ 24-1 = 0 ~ 15。

         ■计算机中常见的数据宽度

【新书推荐】2.4节 数据宽度_第1张图片

                                                图2-6 常见的数据宽度

2.4.3 数据存储范围

字节(Byte) :0~0xFF                   8位     (0  ~ 28-1)

字(Word): 0~ 0xFFFF                  16位    (0  ~ 216-1)

双字:0~ 0xFFFFFFFF                    32位    (0  ~ 232-1)

四字:0~0xFFFFFFFFFFFFFFFF    64位    (0  ~ 264-1)

如果要存储的数据超过最大宽度,那么多余的数据将被丢弃!称为数据溢出。

        【新书推荐】2.4节 数据宽度_第2张图片

                                                        图2-7 存储范围

         图2-7分别描述了字节、字、双字和四字4个数据类型的存储范围,使用二进制数据位

来表示。

提示

         由编译器定义的数据类型称之为基本数据类型;不同的编程语言使用不同的编译器。不同的编译器定义的数据类型的宽度也会有所不同。

除此之外,也可以由程序员自定义的数据类型。我们将在第二十一章结构和记录中讲解自定义数据类型。

■以圆的形式表现数据的存储范围:双字:0 ~ 0xFFFFFFFF

          【新书推荐】2.4节 数据宽度_第3张图片

                                                图2-8 以圆的形式表示存储范围

如果要存储的数据超过最大宽度,那么多余的数据将被丢弃,称为数据溢出!

动手实验4:加法运算中的数据溢出

         在DTdebug调试器中,执行32位汇编如下汇编指令:

         mov al,0xFF

         add al,1

         观察al寄存器中的值,并给出解释。

         第一步:打开DTdebug.exe调试器,加载IPMSG2007.exe程序,或随意加载任一程序;

                 【新书推荐】2.4节 数据宽度_第4张图片                                                                     图2-9 Dtdebug调试器加载程序

第二步:双击第一条汇编指令,在弹框中输入mov al,0xff,点击Assemble,接着输入第二条指令 add al,1。

               【新书推荐】2.4节 数据宽度_第5张图片   

                                                图2-10 输入第一条指令

【新书推荐】2.4节 数据宽度_第6张图片

                                                图2-11 输入第二条指令

         第三步:按F8单步执行第一条语句mov al,0xff,al=0xff。

                     【新书推荐】2.4节 数据宽度_第7张图片   

                                图2-12 执行第一条指令

         第四步:继续按F8,执行第二条语句add al,1,al=0。

                 【新书推荐】2.4节 数据宽度_第8张图片

                                图2-13 执行第二条指令

结论:十六进制数FFH+1 = 100H。Al寄存器的存储范围是0~FFH,100H超出FF范围,因而AL寄存器只保留8位数00H,进位值1溢出后丢失。

提示

         16位计算机一次读写内存数据的最大宽度为16位,因而称为16位计算机。与此同理,32位计算机一次读写内存数据的最大宽度为32位。64位计算机一次读写内存数据的最大宽度为64位。

思考

1.在16位计算机中,超过16位的数据如何进行算术逻辑运算?

2.数据溢出后丢失了吗?假如真的丢失,是否可以找回?

这两个问题先留给读者,我们将在后续的课程中,以代码的形式给出答案。

练习

仔细体会计算机计数与数学计数的区别:计算机中的数据一定是有宽度限制的。

思考题:

1、为什么计算机会被称为16位、32位计算机或者64位呢?

2、如果数据超过内存单元的数据宽度,计算机还可以对该数据进行加减乘除运算吗?

本文摘自编程达人系列教材《X86汇编语言基础教程》。

你可能感兴趣的:(《X86汇编语言程序设计》,汇编)