1.2 数据恢复相关知识
1.2.1 数据的表示方式
计算机内的数据一般分为无符号数和带符号数两种,对于无符号数而言,整个数据均为数值部分,也就是说,该数据是正数或者是零;对于带符号的数据,在计算机中有3种表示方法:即原码、补码和反码;它们都是由符号位和数值两部分组成,数据最高位为符号位,符号位使用“0”表示正数,使用“1”表示负数;剩余位为数值部分。
1.原码表示法
正数的符号位用“0”表示,而负数的符号位用“1”表示,数值部分按二进制的形式表示。
例1.1 已知X=+42,Y=-42,求:X、Y的八位和十六位二进制数的原码并转换为对应的十六进制数。
解:
(1)X和Y八位二进制数以及对应十六进制的原码
(2)X和Y十六位二进制数以及对应十六进制的原码
原码表示很直观,与真值转换也很方便;但是原码进行加、减运算时,符号位不能视同数值一起参与运算,这时需要通过判断两数的符号来决定两数绝对值是做加法运算还是做减法运算,而且还要判断两数绝对值的大小,取绝对值大的数的符号作为结果的符号,这样运算规则不仅复杂,而且运算时间长。
2.反码表示法
正整数的反码表示与其原码表示相同;负整数的反码表示是将该数的原码除符号位以外其余各位取反。
例1.2 已知X=+42,Y=-42,求:X、Y的八位和十六位二进制数的反码并转换为对应的十六进制数。
解:
(1)X和Y八位二进制数以及对应十六进制的反码
(2)X和Y十六位二进制数以及对应十六进制的反码
3.补码表示法
正整数的补码表示与其原码表示相同;负整数的补码表示为先求该数的反码,再在最低位加1,即负整数的补码等于其反码加1。
补码是计算机中用得最多的一种带符号数表示,因为计算机中最多的运算是加、减运算,补码的表示使符号位可以和有效数值部分一起直接参与加、减运算,无须像原码那样对符号位进行判断,从而简化了运算规则,提高了机器运算速度。因此,在计算机中对于带符号的数值一般是以补码表示的。
例1.3 已知X=+42,Y=-42,求:X、Y的八位和十六位二进制数的补码并转换为对应的十六进制数。
解:
(1)X和Y八位二进制数以及对应十六进制的补码
求Y的补码,先求Y的反码:
由于负整数的补码等于反码加1,
因此,[Y]补=[Y]反+(1)2=(11010101+1)2=(11010110)2=(D6)16
(2)X和Y十六位二进制数以及对应十六进制的补码
求Y的补码,先求Y的反码:
由于负整数的补码等于反码加1,
因此,[Y]补=[Y]反+(1)2=(1111 1111 1101 0110)2=(FFD6)16
1.2.2 数据的存储形式
数据的存储形式,也就是数据在存储器中的存放顺序。在表示数值的大小时,由于1字节最大只能表示到255(注:无符号数),如果要表示大于255的数据,则需要N字节,其中:N为大于或者等于2的正整数,这就存在N字节在存储器中存放顺序的问题;在存储器中对N字节组成的数据有大头位序和小头位序两种存储形式。
1.大头位序(Big-Endian)
采用大头位序存储的数据,在存储器中的存放顺序是:从左到右为最高字节向最低字节依次存放,即高字节存放在前(左)、低字节存放在后(右)。
假设某数据由N字节组成,其中:N为大于或者等于2的正整数;N字节分别为“X1,X2,X3,…,XN”,如果采用大头位序存储,在存储器中的存放顺序为“X1 X2 X3 …XN”;则该数据的值为X1X2X3…XN。
例1.4 十进制数143360,转换成十六进制数为23000;在存储器中至少需要3字节来存储该数据。十进制数143360采用大头位序在存储器中分别占用3至8字节的存储形式见表1.1所列。
表1.1 采用大头位序在存储器中的存储形式
如果该数据占用9字节,则在该数据前(左)添加1字节值“00”,以此类推。
2.小头位序(Little-Endian)
采用小头位序存储的数据,其数据在存储器中的存放顺序是:从左到右为最低字节向最高字节依次存放,即低字节存放在前(左)、高字节存放在后(右)。
假设某数据由N字节组成,其中:N为大于或者等于2的正整数;N字节分别为“X1,X2,X3,…,XN”,如果采用小头位序存储,在存储器中的存放顺序为“X1 X2 X3 …XN”;则该数据的值为XN…X3X2X1。
例1.5 十进制数143360,转换成十六进制数为23000;在存储器中至少需要3字节来存储该数据。十进制数143360采用小头位序在存储器中分别占用3至8字节的存储形式见表1.2所列。
表1.2 采用小头位序在存储器中的存储形式
如果该数据占用9字节,则在该数据后(右)添加1字节值“00”,以此类推。
不同的分区形式、文件系统,数据的存放形式不同。在MBR分区、GPT分区、FAT32和NTFS文件系统中,数据的存储形式采用小头位序;而在动态磁盘的LDM数据库中数据存储形式则是采用大头位序。
1.2.3 计算机的启动过程
计算机的启动过程主要由以下几个步骤组成。
(1)开机,BIOS加电自检,如果自检正常,则转到第2步;自检不正常,则出现错误提示或者响声并死机。
(2)根据CMOS的设置开始启动,将硬盘(假设CMOS的设置是硬盘为第一启动顺序)的0号扇区(即硬盘0磁头0柱面1扇区,也就是主引导扇区)读入内存地址0000:7C00处,并且从0000:7C00处开始执行。
(3)检查0000:7DFE是否等于0XAA55。若不等于则转去尝试其他介质;如果没有其他启动介质,则显示“No ROM BASIC”,然后死机。
(4)主引导记录先将自己复制到0000:0600处,然后继续执行。
(5)在主分区表中搜索标志为活动的分区。如果发现没有活动分区或者不止一个活动分区,则停止。
(6)将活动分区的第一个扇区读入内存地址0000:7C00处。
(7)检查0000:7DFE是否等于0XAA55,若不等于则显示“Missing Operating System”,然后停止。
(8)跳转到0000:7C00处继续执行特定系统的启动程序。
以上步骤是标准的硬盘主引导扇区,多系统引导程序的引导过程与此不同;多系统引导程序(如:Smart Boot Manager,BootStar,PQBoot等)是将标准主引导记录替换成自己的引导程序,在运行系统启动程序之前让用户选择想要启动的分区。而某些系统自带的多系统引导程序(如:LILO、NT Loader、一键还原等),则可以将自己的引导程序放在系统所处分区的0号扇区中,在Linux中即为两个扇区的Super Block。有关多系统引导程序,请读者参阅有关资料。