本节内容:计算机受制于物理器件的制约,存储或读写数据的宽度是有长度限制的,通常我们使用数据位的位数来表示数据宽度,如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-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-7 存储范围
图2-7分别描述了字节、字、双字和四字4个数据类型的存储范围,使用二进制数据位
来表示。
提示
由编译器定义的数据类型称之为基本数据类型;不同的编程语言使用不同的编译器。不同的编译器定义的数据类型的宽度也会有所不同。
除此之外,也可以由程序员自定义的数据类型。我们将在第二十一章结构和记录中讲解自定义数据类型。
■以圆的形式表现数据的存储范围:双字:0 ~ 0xFFFFFFFF
图2-8 以圆的形式表示存储范围
如果要存储的数据超过最大宽度,那么多余的数据将被丢弃,称为数据溢出!
动手实验4:加法运算中的数据溢出
在DTdebug调试器中,执行32位汇编如下汇编指令:
mov al,0xFF
add al,1
观察al寄存器中的值,并给出解释。
第一步:打开DTdebug.exe调试器,加载IPMSG2007.exe程序,或随意加载任一程序;
图2-9 Dtdebug调试器加载程序
第二步:双击第一条汇编指令,在弹框中输入mov al,0xff,点击Assemble,接着输入第二条指令 add al,1。
图2-10 输入第一条指令
图2-11 输入第二条指令
第三步:按F8单步执行第一条语句mov al,0xff,al=0xff。
图2-12 执行第一条指令
第四步:继续按F8,执行第二条语句add al,1,al=0。
图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汇编语言基础教程》。