Chinapub. CoM 第15章字节与十六进制 上一章中的两个改进的加法机淸晰地解释了数据路径的概念。在整个电路中,8位值从 个部件传到另一个部件。它们是加法器、锁存器、选择器的输入,经过运算或操作又从这些 部件输出。这些数由开关定义,最后由灯泡来表示结果。可以认为电路中的数据路径的宽度 是8位。可是,为什么一定是8位,而不是6位、7位、9位或10位呢? 最简单的回答就是这些加法机是在第12章中最原始的加法机上改进而来的,而最原始的 那个加法机就是8位。不过,这个解释似乎很缺乏说服力。实际上,用8位的原因是它表示一 个字节。 字节这个词大概是在1956年前后由IBM公司最早提出来的。这个词起源于bite,但用y代 替了ⅰ,以便不会被人误认为它是bit。曾经有一段时期,字节仅仅简单地表示特定数据路径上 数据的位数。但是到了20世纪60年代中期,随着IBM的360系统的发展(一种大型复杂的商用 计算机),字节这个词专门用来表示8位二进制数 作为一个8位数,一个字节可以从0000000取值到1111这些数可以代表0~255的正 数,也可以表示-128~127范围之内的正、负数。总之,一个特定的字节可以代表2即256种不 同事物中的一个。 8位数事实上是很适用的,字节在很多方面都比一位数优越。IBM采用字节的一个原因就 是它们易于以BCD(将在第23章中描述)这种格式保存。巧的是,在以后的各章中你会看到 字节用于保存文本也是很合适的,因为世界上大部分书面语言都可以用少于256个字符的字符 集来表示(除了汉语、日语、韩语等所用的表意文字以外)。用字节表示黑白图像中的灰度也 是很合适的,因为人眼大约能区分256种不同程度的灰度。当一个字节不足以表示信息时(如 刚才说的表意语言:汉语、日语、韩语等),用两个字节,即21“或65536也可以很好地表示。 半个字节,即4位二进制数,有时被称为半位元组,它比起字节而言,用的并不频繁 由于字节在计算机内部经常出现,所以尽可能简单明了地表示它会带来很大方便。例如, 个8位二进制数10110110的确很直观但是不简明 当然也可以用十进制数来表示字节,但这要求从二进制换算成十进制,这样做不仅不简 单,反而是件很令人讨厌的事。第8章曾描述了一种很直观的方法。每一位二进制数字写到对 应的方盒子中,并在其下方标上2的乘方数。把每一列相乘后再相加即可得到对应的十进制数。 下面是10110110的转换 口回回回回回 128×64x32x16X8×4x2X1 國+回+回+d+回+团+回+回=[2 把十进制数转换为二进制数就更麻烦了。你可以用十进制数去除以以递减顺序排列的2的 幂,每除一次,商是一个二进制位,而余数则继续去除以下一个最大的2的幂。下面是十进制 数182转换成对应二进制数的过程
下载 第15章 字节与十六进制 上一章中的两个改进的加法机清晰地解释了数据路径的概念。在整个电路中, 8位值从一 个部件传到另一个部件。它们是加法器、锁存器、选择器的输入,经过运算或操作又从这些 部件输出。这些数由开关定义,最后由灯泡来表示结果。可以认为电路中的数据路径的宽度 是8位。可是,为什么一定是8位,而不是6位、7位、9位或1 0位呢? 最简单的回答就是这些加法机是在第 1 2章中最原始的加法机上改进而来的,而最原始的 那个加法机就是 8位。不过,这个解释似乎很缺乏说服力。实际上,用 8位的原因是它表示一 个字节。 字节这个词大概是在 1 9 5 6年前后由I B M公司最早提出来的。这个词起源于 b i t e,但用y代 替了i,以便不会被人误认为它是 b i t。曾经有一段时期,字节仅仅简单地表示特定数据路径上 数据的位数。但是到了 2 0世纪6 0年代中期,随着I B M的3 6 0系统的发展(一种大型复杂的商用 计算机),字节这个词专门用来表示 8位二进制数。 作为一个8位数,一个字节可以从 0 0 0 0 0 0 0 0取值到11111111。这些数可以代表0~2 5 5的正 数,也可以表示- 1 2 8~1 2 7范围之内的正、负数。总之,一个特定的字节可以代表 2 8即2 5 6种不 同事物中的一个。 8位数事实上是很适用的,字节在很多方面都比一位数优越。 I B M采用字节的一个原因就 是它们易于以B C D(将在第2 3章中描述)这种格式保存。巧的是,在以后的各章中你会看到 字节用于保存文本也是很合适的,因为世界上大部分书面语言都可以用少于 2 5 6个字符的字符 集来表示(除了汉语、日语、韩语等所用的表意文字以外)。用字节表示黑白图像中的灰度也 是很合适的,因为人眼大约能区分 2 5 6种不同程度的灰度。当一个字节不足以表示信息时(如 刚才说的表意语言:汉语、日语、韩语等),用两个字节,即2 1 6或65 536也可以很好地表示。 半个字节,即4位二进制数,有时被称为半位元组,它比起字节而言,用的并不频繁。 由于字节在计算机内部经常出现,所以尽可能简单明了地表示它会带来很大方便。例如, 一个8位二进制数1 0 11 0 11 0的确很直观但是不简明。 当然也可以用十进制数来表示字节,但这要求从二进制换算成十进制,这样做不仅不简 单,反而是件很令人讨厌的事。第 8章曾描述了一种很直观的方法。每一位二进制数字写到对 应的方盒子中,并在其下方标上2的乘方数。把每一列相乘后再相加即可得到对应的十进制数。 下面是1 0 11 0 11 0的转换: 把十进制数转换为二进制数就更麻烦了。你可以用十进制数去除以以递减顺序排列的 2的 幂,每除一次,商是一个二进制位,而余数则继续去除以下一个最大的 2的幂。下面是十进制 数1 8 2转换成对应二进制数的过程:
第5章字节与六述132 下载 回回回 128÷64÷32÷16+8+4+2÷1 回回回 第8章有关于这个方法的更多描述。总之,在十进制数和二进制数之间进行转换通常不是 件十分简单的事。 从第8章中我们还学习了八进制数字系统,八进制数字系统只使用数字0、1、2、3、4、5、 6、7。在八进制数和二进制数之间进行转换却是小菜一碟,你只要记住每个八进制数字对应3 位二进制数字即可,如下表所示 八进制 01234567 如果已有一个二进制数字(如10110110),则从最右边的数字开始,每3位二进制数字组 成一组,即可转换为对应的八进制数: ll1119 2 可见,字节1010110可以表示为八进制的266。这显然已简单了很多,八进制确实是 示字节的一个好方法,但其中仍然有一个问题。 字节的二进制表示范围是从000000001111,,应的八进制表示范围是从000~377。 上例清楚地表示出3位二进制数对应于最右边和中间的八进制数,而2位二进制数对应于最左 边的八进制数,这就表明一个16位二进制数的八进制表示和把它分成两个字节后的八进制表 示有所不同 L8116111188181 1118 9010y 为了使多字节值能和单字节值的表示一致,需要的系统应该能使每个字节平分,这意味 着应该把每个字节分成4组,每组2位(以4为基数):或2组,每组4位(以16为基数) 让我们看看以16为基数的情况,这是我们还未接触过的新的记数系统。它被称为“十六 进制( hexadecimal)”,这个词本身就让人迷惑,因为大部分以hexa-为前缀的词都是指与6有 关的事物,而这里 hexadecimal却是指16。虽然微软公司在技术出版物的格式方面明确地声明 不要将十六进制缩写为hex,但绝大多数人还是使用这种缩写。 在十进制中,我们这样计数: 0123456789101112
第8章有关于这个方法的更多描述。总之,在十进制数和二进制数之间进行转换通常不是 件十分简单的事。 从第8章中我们还学习了八进制数字系统,八进制数字系统只使用数字 0、1、2、3、4、5、 6、7。在八进制数和二进制数之间进行转换却是小菜一碟,你只要记住每个八进制数字对应 3 位二进制数字即可,如下表所示: 二进制 八进制 0 0 0 0 0 0 1 1 0 1 0 2 0 11 3 1 0 0 4 1 0 1 5 11 0 6 111 7 如果已有一个二进制数字(如 1 0 11 0 11 0),则从最右边的数字开始,每 3位二进制数字组 成一组,即可转换为对应的八进制数: 可见,字节1 0 11 0 11 0可以表示为八进制的 2 6 6。 这显然已简单了很多,八进制确实是表 示字节的一个好方法,但其中仍然有一个问题。 字节的二进制表示范围是从 0 0 0 0 0 0 0 0~11111111,对应的八进制表示范围是从 0 0 0~3 7 7。 上例清楚地表示出 3位二进制数对应于最右边和中间的八进制数,而 2位二进制数对应于最左 边的八进制数,这就表明一个 1 6位二进制数的八进制表示和把它分成两个字节后的八进制表 示有所不同: 为了使多字节值能和单字节值的表示一致,需要的系统应该能使每个字节平分,这意味 着应该把每个字节分成4组,每组2位(以4为基数);或2组,每组4位(以1 6为基数)。 让我们看看以 1 6为基数的情况,这是我们还未接触过的新的记数系统。它被称为“十六 进制(h e x a d e c i m a l)”,这个词本身就让人迷惑,因为大部分以 h e x a -为前缀的词都是指与 6有 关的事物,而这里 h e x a d e c i m a l却是指1 6。虽然微软公司在技术出版物的格式方面明确地声明 不要将十六进制缩写为 hex ,但绝大多数人还是使用这种缩写。 在十进制中,我们这样计数: 0 1 2 3 4 5 6 7 8 9 10 11 12 …… 第15章 字节与十六进制 132 下载
13码的奥码 China pub coM 下载 在八进制中,不需要8和9: 01234567101112 同样,以4为基数的系统不需要4、5、6或7: 0123101112 而二进制只需要0和1 011011100… 但是十六进制有些不同,它需要的符号比十进制还要多,如下所示: 0123456789??????101112…… 上图中10出现的地方是表示十进制中的数16。此外,还需要6个符号来表示十六进制数 但这些符号是什么呢?它们来自哪里呢?最形象的方法是引入6个新符号,例如 它们不同于大部分数字用的符号,这些符号的优点是便于记忆,而且从某种意义上代表 了它们应该表示的数字。你看,重10加仑的牛仔帽、一个橄榄球(一个橄榄球队有11人)、 打椰子、一只黑猫(和不吉利的13相联系)、一轮满月(一般出现在新月后的第14天晚上)以 及让人们联想到 Julius caesar在三月的第15天被暗杀时所用的匕首。 每个字节都可以用两个十六进制数表示,换句话说,一个十六进制数代表4位二进制数 即半个字节。下表描述了在二进制数、十六进制树和十进制数之间的转换: 二进制数+六进制数+进制数二进制数+六进制数+进制数 0 1 9 0010 2 21010 0011 3111 11 0100 12 5 1101 0110 1110 111 了 71111 15 下图表示如何用十六进制表示字节10110110: 即使要表示多字节数也很容易:
在八进制中,不需要8和9: 0 1 2 3 4 5 6 7 10 11 12 …… 同样,以4为基数的系统不需要4、5、6或7: 0 1 2 3 10 11 12 …… 而二进制只需要0和1: 0 1 10 11 100 …… 但是十六进制有些不同,它需要的符号比十进制还要多,如下所示: 0 1 2 3 4 5 6 7 8 9 ??????10 11 12 …… 上图中1 0出现的地方是表示十进制中的数 1 6。此外,还需要 6个符号来表示十六进制数, 但这些符号是什么呢?它们来自哪里呢?最形象的方法是引入 6个新符号,例如: 它们不同于大部分数字用的符号,这些符号的优点是便于记忆,而且从某种意义上代表 了它们应该表示的数字。你看,重 1 0加仑的牛仔帽、一个橄榄球(一个橄榄球队有 11人)、一 打椰子、一只黑猫(和不吉利的 1 3相联系)、一轮满月(一般出现在新月后的第 1 4天晚上)以 及让人们联想到Julius Caesar 在三月的第1 5天被暗杀时所用的匕首。 每个字节都可以用两个十六进制数表示,换句话说,一个十六进制数代表 4位二进制数, 即半个字节。下表描述了在二进制数、十六进制树和十进制数之间的转换: 下图表示如何用十六进制表示字节 1 0 11 0 11 0: 即使要表示多字节数也很容易: 133 编码的奥码 下载 二进制数 十六进制数 十进制数 二进制数 十六进制数 十进制数
第5章字节与六述制134 下载 l11118 l19g101 个字节总是由一对十六进制数来表示 不过,我们绝不会真的用橄榄球或匕首来表示十六进制数,事实上,我们用6个拉丁字母 来表示那6个十六进制数,如下所示: 0123456789 ABCDEF101112… 下表表示出在二进制数、十六进制数和十进制数之间的转换: 二进制数六进制数进制数 0 0010 001l 010l 23456789ABCD 1101 l110 字节10110110可以由十六进制数B6来表示,而不用再画上一个橄榄球。同前面的章一样, 用下标来表示记数系统的基数,如:10110110表示二进制、2312表示四进制、266表 示八进制、182表示十进制、B6。则表示十六进制。不过,这真是挺麻烦的。还好,有 更简单、更通用的方法来表示十六进制:B6还可以进一步简化为B6h 在十六进制数中,每一位的位置都对应于16的幂 1的个数 16的个数 256的个数 4096的个数 65536的个数 十六进制数9A48Ch是 9A48Ch=9×10000h+ A×1000h+ 4×100h+ 8×10h+ C×1h
一个字节总是由一对十六进制数来表示。 不过,我们绝不会真的用橄榄球或匕首来表示十六进制数,事实上,我们用 6个拉丁字母 来表示那6个十六进制数,如下所示: 0 1 2 3 4 5 6 7 8 9 A B C D E F 10 11 12 …… 下表表示出在二进制数、十六进制数和十进制数之间的转换: 二进制数 十六进制数 十进制数 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 2 2 0 0 11 3 3 0 1 0 0 4 4 0 1 0 1 5 5 0 11 0 6 6 0 111 7 7 1 0 0 0 8 8 1 0 0 1 9 9 1 0 1 0 A 1 0 1 0 11 B 11 11 0 0 C 1 2 11 0 1 D 1 3 111 0 E 1 4 1111 F 1 5 字节1 0 11 0 11 0可以由十六进制数B 6来表示,而不用再画上一个橄榄球。同前面的章一样, 用下标来表示记数系统的基数,如: 1 0 11 0 11 0T W O表示二进制、2 3 1 2F O U R表示四进制、2 6 6E I G H T表 示八进制、 1 8 2T E N表示十进制、 B 6 S I X T E E N则表示十六进制。不过,这真是挺麻烦的。还好,有 更简单、更通用的方法来表示十六进制: B 6H E X还可以进一步简化为B 6 h。 在十六进制数中,每一位的位置都对应于 1 6的幂: 十六进制数9 A 4 8 C h是: 9A48Ch = 9×1 0 0 0 0 h + A×1 0 0 0 h + 4×1 0 0 h + 8×1 0 h + C×1 h 第15章 字节与十六进制 134 下载 1的个数 16的个数 256的个数 4096的个数 65 536的个数
135码的奥码 1°pbeM 下载 用16的乘方表示为: 9A48Ch=9×164+ A×163+ 4×162+ 8×16 C×16 用对应的十进制数代入为 9A48Ch=9×65536+ A×4096+ 4×256+ 8×16 C×1 注意,在写一个数时,不用下标来表示数的基数也不会引起混淆。9就是9,不管它是十 进制数还是十六进制数:而A则显然是个十六进制数,相当于十进制中的10 把所有数字转换成十进制数需要下列运算 9A48Ch=9×65536 10×4096+ 4×256 8×16+ 答案是631948。以上是一个十六进制数如何转换成十进制数的过程。 下面是把任何一个4位十六进制数转换成十进制数的模板 匚[匚 4096X256 X16 1 例如,这儿有一个79ACh的转换过程。记住,十六进制中的A和C对应于十进制中的10和12: 把十进制数转换为十六进制数需要做除法。如果数字比255小,则可以用1个字节来表示 对应于两个十六进制数。为了求出这两个数,用原数去除以16得到商和余数。举例说明,182 除以16得11,余6,所以十六进制表示为B6h 如果想要转换的十进制数比65536小,则十六进制表示会有4位或更少。下面是把这样 个十进制数转换为十六进制数的一个模板:
用1 6的乘方表示为: 9A48Ch = 9×1 64+ A×1 63+ 4×1 62+ 8×1 61+ C×1 60 用对应的十进制数代入为: 9A48Ch = 9×6 5 5 3 6 + A×4 0 9 6 + 4×2 5 6 + 8×1 6 + C×1 注意,在写一个数时,不用下标来表示数的基数也不会引起混淆。 9就是9,不管它是十 进制数还是十六进制数;而 A则显然是个十六进制数,相当于十进制中的 1 0。 把所有数字转换成十进制数需要下列运算: 9A48Ch = 9×6 5 5 3 6 + 1 0×4 0 9 6 + 4×2 5 6 + 8×1 6 + 1 2×1 答案是631 948。以上是一个十六进制数如何转换成十进制数的过程。 下面是把任何一个4位十六进制数转换成十进制数的模板: 例如,这儿有一个7 9 A C h的转换过程。记住,十六进制中的A和C对应于十进制中的1 0和1 2: 把十进制数转换为十六进制数需要做除法。如果数字比 2 5 5小,则可以用1个字节来表示, 对应于两个十六进制数。为了求出这两个数,用原数去除以 1 6得到商和余数。举例说明, 1 8 2 除以1 6得11,余6,所以十六进制表示为B 6 h。 如果想要转换的十进制数比 65 536小,则十六进制表示会有 4位或更少。下面是把这样一 个十进制数转换为十六进制数的一个模板: 135 编码的奥码 下载
第5章字节与十六进制 136 下载 4096-256-16 先把整个十进制数放到左上角的盒子里,作为第一个被除数,用它除以4096(第一个除 数),商放到被除数下面的盒子里,余数放到被除数右边的盒子里。余数成为新的被除数,用 它除以256。以下是31148如何转换成十六进制数的过程 1482476172 12 4096 256 16 10 12 当然,十进制数的10和12用十六进制表示就是A和C,故结果是79ACh 这个方法的问题是如果你想用一个计算器来做除法运算,它不会显示出余数是多少。如果 你用31148除以4096,计算器给出的结果只能是76044921875。为了计算余数你得用4096×7 (得到28672),再从31148中减去它;或者用4096乘以0.6044921875,即商的小数部分。(不 过,有些计算器具有十进制数和十六进制数之间的转换功能 把小于65535的十进制数转换为十六进制数的另一个方法是先把原数除以256而分为两个 字节,对于每个字节,再除以16。下面是模板 256 16 16 从最上面开始,每做完一次除法,商就进入除数左下方的盒子里,而余数进入右边的盒 里里。例如,51966的转换过程是 5196 256 2n2 254 16 得到的十六进制数字是12、10、15和14,即CAFE,它看起来倒更像一个单词而非一个数字! 下面是和十六进制相关的加法表
第15章 字节与十六进制 136 下载 先把整个十进制数放到左上角的盒子里,作为第一个被除数,用它除以 4 0 9 6(第一个除 数),商放到被除数下面的盒子里,余数放到被除数右边的盒子里。余数成为新的被除数,用 它除以2 5 6。以下是31 148如何转换成十六进制数的过程: 当然,十进制数的1 0和1 2用十六进制表示就是A和C,故结果是7 9 A C h . 这个方法的问题是如果你想用一个计算器来做除法运算,它不会显示出余数是多少。如果 你用31 148除以4 0 9 6,计算器给出的结果只能是 7 . 6 0 4 4 9 2 1 8 7 5。为了计算余数你得用 4 0 9 6×7 (得到28 672),再从31 148中减去它;或者用4 0 9 6乘以0 . 6 0 4 4 9 2 1 8 7 5,即商的小数部分。(不 过,有些计算器具有十进制数和十六进制数之间的转换功能。) 把小于65 535的十进制数转换为十六进制数的另一个方法是先把原数除以 2 5 6而分为两个 字节,对于每个字节,再除以 1 6。下面是模板: 从最上面开始,每做完一次除法,商就进入除数左下方的盒子里,而余数进入右边的盒 里里。例如,51 966的转换过程是: 得到的十六进制数字是1 2、1 0、1 5和1 4,即C A F E,它看起来倒更像一个单词而非一个数字! 下面是和十六进制相关的加法表:
137码的奥码 Chia°bue0M 下载 D 10111213 C D 799A|B<|D 1011121314151617 F101 13141516171911A CcD 1415161719191A15 12131415161719131A1B1 101112131415161719191A161c1 可以用这张表和通常的进位规则来对十六进制数做加法: 4A3378E2 +877AB982 D1AE3264 曾在第13章中讲过可以用2的补数来表示负数。如果在二进制中处理8位带符号数,则所 有的负数都是以1开头的。在十六进制中,两位带符号数若是以8、9、A、B、C、D、E或F开 头则是负数。例如,99h可能表示十进制的153(如果处理的是1个字节的无符号数)或十进制 的一103(如果处理的是有符号数) 字节9gh也有可能就是十进制的99,关于这一点会在第23章中解释,但是下一步必须先讲 讲存储器
可以用这张表和通常的进位规则来对十六进制数做加法: 4 A 3 3 7 8 E 2 + 8 7 7 A B 9 8 2 D 1 A E 3 2 6 4 曾在第1 3章中讲过可以用 2的补数来表示负数。如果在二进制中处理 8位带符号数,则所 有的负数都是以1开头的。在十六进制中,两位带符号数若是以 8、9、A、B、C、D、E或F开 头则是负数。例如,9 9 h可能表示十进制的1 5 3(如果处理的是1个字节的无符号数)或十进制 的-1 0 3(如果处理的是有符号数)。 字节9 9 h也有可能就是十进制的 9 9,关于这一点会在第2 3章中解释,但是下一步必须先讲 讲存储器。 137 编码的奥码 下载