且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

《计算机系统:核心概念及软硬件实现(原书第4版)》——3.4十六进制和符号表示

更新时间:2021-10-03 11:19:59

本节书摘来自华章计算机《计算机系统:核心概念及软硬件实现(原书第4版)》一书中的第3章,第3.4节,作者:[美] J. 斯坦利·沃法德(J. Stanley Warford)著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

3.4 十六进制和符号表示

前面章节中的二进制表示是整数表示,本节介绍另一种基数,将用于下一章中介绍的计算机。本章还将介绍这种计算机是如何存储字母信息的。
3.4.1十六进制
假定一个人有16根手指而不是10根。那么发明阿拉伯数字时,会发生什么情况呢?记得10根手指模式是从0开始,一直继续发明新的符号1、2,直到倒数第二根手指9,接着在最后一根手指,把1和0结合在一起表示下一个数10。
如果是16根手指,当达到9时,仍然还剩下不少的指头,必须继续发明新的符号,这些额外的符号通常用英语字母表开头的字母表示,因此以16为底(十六进制,或缩写为hex)的计数是这样的:
《计算机系统:核心概念及软硬件实现(原书第4版)》——3.4十六进制和符号表示

当十六进制数字包含许多位时,计数就有点儿麻烦。思考从8BE7、C9D和9FFE开始接下来的5个数字:
《计算机系统:核心概念及软硬件实现(原书第4版)》——3.4十六进制和符号表示

当写八进制数时,数字看上去有比它们实际要大的趋势;写成十六进制数时,效果是相反的,数字有看上去比它们实际要小的趋势。比较十六进制数的列表和十进制数的列表,可以看出18(hex)实际上是24(dec)。
3.4.2基数转换
在十六进制中,每个位置值都是比它低一位的位置值的16倍。十六进制转换为十进制,可以简单地把位置值乘以该位置的数字,并相加。

《计算机系统:核心概念及软硬件实现(原书第4版)》——3.4十六进制和符号表示


例3.24图3-21给出了把8BE7从十六进制转换到十进制的过程。B的十进制值是11,E的十进制值是14。 □
从十进制转换到十六进制的过程类似于从十进制转换到二进制的过程,不过不是一个接一个地除以2,而是除以16,并保存余数的记录,这些余数就是转换后的十六进制数。
对于小于255(dec)或FF(hex)的数,两种进制互相转换用图3-22所示的表格是很容易做到的。表中的主体是十进制数,左列和顶行是十六进制数。
《计算机系统:核心概念及软硬件实现(原书第4版)》——3.4十六进制和符号表示
《计算机系统:核心概念及软硬件实现(原书第4版)》——3.4十六进制和符号表示

例3.25把9C(hex)转换到十进制,查看9行和C列找到156(dec);把125(dec)转换到十六进制,在表的主体中找到125,从对应的左列和顶行得出7D(hex)。 □
如果计算机以二进制格式存储信息,那么为什么要学习十六进制呢?答案是,二进制和十六进制之间存在特殊关系,如图3-23所示。4位有16种可能的组合,而正好有16个十六进制数字,每个十六进制数字代表这4位。
为了节约打印空间,位模式经常被写成十六进制形式。一个16位机器的手册可能会说某个内存位置包含01D3,这要比说它包含0000 0001 1101 0011简短多了。

《计算机系统:核心概念及软硬件实现(原书第4版)》——3.4十六进制和符号表示


把无符号二进制转换到十六进制,从最右边开始把位划分为每4个一组,给每组一个图3-23对应的十六进制数字。把十六进制转换到无符号二进制,简单地把过程反过来即可。
例3.26写出10位无符号二进制数10 1001 1100的十六进制形式,从最右边的4位1100开始:
10 1001 1100(bin)=29C(hex) □
由于10位不能刚好分为4个一组,所以在图3-23中查找最左边的数字时,在前面加2个0。在本例中,最左边的十六进制数字来自
10(bin)=0010(bin)=2(hex) □
例3.27对于14位单元
0D60(hex)=00 1101 0110 0000(bin)
注意,最末尾的十六进制0代表4个二进制0,而最高位的十六进制0只代表2个二进制0。 □
把十进制转换为无符号二进制,你可能想要用十六进制-十进制表作为中间步骤。通过查找图3-22中的十六进制值,不用任何计算,再根据图3-23把每个数字转换为二进制即可。
例3.28对于6位单元,
29(dec)=1D(hex)=01 1101(bin)
转换中的每一步都是一次简单的查表。 □
在机器语言程序代码或程序记录中,几乎不会把数字写成有负号的十六进制形式,而是把符号位隐含地包含在十六进制表示的位模式中。你必须牢记十六进制只是二进制序列的一个方便的缩写,硬件只存储二进制值。
例3.29如果一个12位的内存位置包含F7A(hex),那么通过思考下面的位模式可以得出十进制数。
F7A(hex)=1111 0111 1010(bin)
符号位是1,因此这个数是负数,转换为十进制是
F7A(hex)=-134(dec)
注意,尽管可以解释成一个负数,但是十六进制数不会写成有负号的形式。 □
3.4.3字符
因为计算机内存是二进制的,所以字母字符必须要编码后才能存储到内存中。美国信息交换标准代码(American Standard Code for Information Interchange,ASCII)是一个使用广泛的字母字符二进制编码。
ASCII包含所有大写和小写的英文字母、10个数字和特殊符号(例如,标点)。它的一些符号是不能打印的,主要用于在计算机之间传递信息或用于控制外围设备。
ASCII是一种7位的编码。因为7位有27=128种可能的组合,所以有128个ASCII字符,图3-24给出了所有这些符号。表中第一列是不可打印的符号,它们的意思列在表下,表中其余部分是可打印的符号。
例3.30代表响铃(bell)的序列000 0111使终端发出哗哗声。另一个例子是一组命令,用于控制纸张打印机在新的一行起始开始打印。计算机发送一个回车符(CR,000 1101),再发送一个换行符(LF,000 1010),CR使得“打印头”或光标回到纸张的左边,LF使纸张往下走一行。 □
例3.30名字Tom会以下列ASCII形式存储,
101 0100
110 1111
110 1101
如果将这个位序列发送到输出终端,就会显示“Tom”。 □
例3.32街道地址52 Elm会以下列ASCII形式存储,
011 0101
011 0010
010 0000
100 0101
110 1100
110 1101
2和E之间的空格是一个独立的ASCII字符。 □
尽管ASCII使用广泛,但它绝对不是表示字符的唯一编码。由于这种7位编码没有提供除英语外其他语言中常见的重音符号,因此它的使用是有限的。由于这个限制,所以对其做了扩展,使用8位来提供很多7位无法表示的重音符号。
《计算机系统:核心概念及软硬件实现(原书第4版)》——3.4十六进制和符号表示

图3-24 美国信息交换标准代码(ASCII)
但即便有了这个扩展仍不足以处理非拉丁字符。由于全球信息交流的重要性,所以发明了一种称为Unicode(统一码)的标准。Unicode的目标是可以对世界上所有语言的符号进行编码,甚至包括已经不再使用的古语言。Unicode符号集合使用32位或4字节。由于大多数的应用不会用到这些符号中的大多数,所以Unicode标准制定了使用小于4字节的技术。基本多文种平面(Basic Multilingual Plane)包含常用的Unicode字符,每个字符仅占用2字节。用它来存储1字节的扩展ASCII码,所需存储空间是其两倍。不过基本多文种平面实际上包含了世界上所有的书面语言,包括阿拉伯语、亚美尼亚语、汉语、西里尔语、希腊语、希伯来语、日语、韩语、叙利亚语、许多非洲语言,甚至加拿大土著语言模式。