中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » 网络日志(Blog) » 1DOS学习中的文章展开,方便阅读。(20160203)
« [1] [2] [3] [4] [5] [6] »
作者:
标题: 1DOS学习中的文章展开,方便阅读。(20160203) 上一主题 | 下一主题
zzz19760225
超级版主




积分 3673
发帖 2020
注册 2016-2-1
状态 离线
『第 16 楼』:  ASCII美国信息交换标准代码

ASCII
编辑词条
该词条缺少词条分类,补充相关内容帮助词条更加完善!立刻编辑>>

ASCII(pronunciation: /ˈæski/ ASS-kee,American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统。它主要用于显示现代英语,而其扩展版本EASCII则可以部分支持其他西欧语言,并等同于国际标准ISO/IEC 646。由于万维网使得ASCII广为通用,直到2007年12月,逐渐被Unicode取代。
中文名        美国信息交换标准代码
简称        ASCII
类别        编码标准       
外文名        American Standard Code for Information Interchange
别称        ASCII代码
作用        显示现代英语和其他西欧语言


1简要介绍
2历史沿革
3代码产生
4标准码表
5大小规则
6国际问题
7键盘常用
8代码算法
9汉字编码
1 简要介绍 编辑

ASCII
ASCII 码使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符。标准ASCII 码也叫基础ASCII码,使用7 位二进制数来表示所有的大写和小写字母,数字0 到9、标点符号, 以及在美式英语中使用的特殊控制字符。其中:

0~31及127(共33个)是控制字符或通信专用字符(其余为可显示字符),如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BS(退格)、BEL(响铃)等;通信专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等;ASCII值为8、9、10 和13 分别转换为退格、制表、换行和回车字符。它们并没有特定的图形显示,但会依不同的应用程序,而对文本显示有不同的影响。

32~126(共95个)是字符(32sp是空格),其中48~57为0到9十个阿拉伯数字

65~90为26个大写英文字母,97~122号为26个小写英文字母,其余为一些标点符号、运算符号等。

同时还要注意,在标准ASCII中,其最高位(b7)用作奇偶校验位。所谓奇偶校验,是指在代码传送过程中用来检验是否出现错误的一种方法,一般分奇校验和偶校验两种。奇校验规定:正确的代码一个字节中1的个数必须是奇数,若非奇数,则在最高位b7添1;偶校验规定:正确的代码一个字节中1的个数必须是偶数,若非偶数,则在最高位b7添1。

后128个称为扩展ASCII码,目前许多基于x86的系统都支持使用扩展(或“高”)ASCII。扩展ASCII 码允许将每个字符的第8 位用于确定附加的128 个特殊符号字符、外来语字母和图形符号。

2 历史沿革 编辑
  6000年前 象形文字

  3000年前 字母表

  1838年到1854年 Samuel F。 B。 Morse发明了电报,字母表中的每个字符对应于一系列短的和长的脉冲

  1821年到1824年 Louis Braille发明盲文,6位代码,它把字符、常用字母组合、常用单字和标点进行编码。

  一个特殊的escape代码表示后续的字符代码应解释为大写。一个特殊的shift代码允许后续代码被解释为数字。

  1931年 CCITT标准化Telex代码,包括Baudot #2的代码,都是包括字符和数字的5位代码。

  1890年 早期计算机的字符码是从Hollerith卡片,6位字符码系统BCDIC(Binary-Coded Decimal Interchange Code:二进制编码十进制交换编码)

  60年代 扩展为8位EBCDIC,IBM大型主机的标准

  1967年 美国信息交换标准码(ASCII:American Standard Code for Information Interchange)

  在字符长度是6位、7位还是8位的问题上产生了很大的争议。从可靠性的观点来看不应使用替换字符,

  因此ASCII不能是6位编码,但由于费用的原因也排除了8位版本的方案(当时每位的储存空间成本仍很昂贵)。

  这样,最终的字符码就有26个小写字母、26个大写字母、10个数字、32个符号、33个句柄和一个空格,总共128个字符码。

  ASCII现在记录在ANSI X3。4-1986字符集-用于信息交换的7位美国国家标准码(7-Bit ASCII:7-Bit American National

  Standard Code for Information Interchange),由美国国家标准协会(American National Standards Institute)发布。

3 代码产生 编辑
在计算机中,所有的数据在存储和运算时都要使用二进制数表示(因为计算机用高电平和低电平分别表示1和0),例如,像a、b、c、d这样的52个字母(包括大写)、以及0、1等数字还有一些常用的符号(例如*、#、@等)在计算机中存储时也要使用二进制数来表示,而具体用哪些二进制数字表示哪个符号,当然每个人都可以约定自己的一套(这就叫编码),而大家如果要想互相通信而不造成混乱,那么大家就必须使用相同的编码规则,于是美国有关的标准化组织就出台了所谓的ASCII编码,统一规定了上述常用符号用哪些二进制数来表示。

美国标准信息交换代码是由美国国家标准学会(American National Standard Institute,ANSI )制定的,标准的单字节字符编码方案,用于基于文本的数据。起始于50年代后期,在1967年定案。它最初是美国国家标准,供不同计算机在相互通信时用作共同遵守的西文字符编码标准,它已被国际标准化组织(International Organization for Standardization,ISO)定为国际标准,称为ISO 646标准。适用于所有拉丁文字字母。

4 标准码表 编辑
Bin

Dec

Hex

缩写/字符

解释

0000,0000        0        00       
NUL(null)[1]

空字符
0000,0001        1        01        SOH(start,of,headline)        标题开始
0000,0010        2        02        STX,(start,of,text)        正文开始
0000,0011        3        03        ETX,(end,of,text)        正文结束
0000,0100        4        04        EOT,(end,of,transmission)        传输结束
0000,0101        5        05        ENQ,(enquiry)        请求
0000,0110        6        06        ACK,(acknowledge)        收到通知
0000,0111        7        07        BEL,(bell)        响铃
0000,1000        8        08        BS,(backspace)        退格
0000,1001        9        09        HT,(horizontal,tab)        水平,制表符
0000,1010        10        0A        LF,(NL,line,feed,new,line)        换行键
0000,1011        11        0B        VT,(vertical,tab)        垂直制表符
0000,1100        12        0C        FF,(NP,form,feed,new,page)        换页键
0000,1101        13        0D        CR,(carriage,return)        回车键
0000,1110        14        0E        SO,(shift,out)        不用切换
0000,1111        15        0F        SI,(shift,in)        启用切换
0001,0000        16        10        DLE,(data,link,escape)        数据,链路,转义
0001,0001        17        11        DC1,(device,control,1)        设备控制1
0001,0010        18        12        DC2,(device,control,2)        设备控制2
0001,0011        19        13        DC3,(device,control,3)        设备控制3
0001,0100        20        14        DC4,(device,control,4)        设备控制4
0001,0101        21        15        NAK,(negative,acknowledge)        拒绝接收
0001,0110        22        16        SYN,(synchronous,idle)        同步空闲
0001,0111        23        17        ETB,(end,of,trans,block)        传输块结束
0001,1000        24        18        CAN,(cancel)        取消
0001,1001        25        19        EM,(end,of,medium)        介质中断
0001,1010        26        1A        SUB,(substitute)        替补
0001,1011        27        1B        ESC,(escape)        换码(溢出)
0001,1100        28        1C        FS,(file,separator)        文件分割符
0001,1101        29        1D        GS,(group,separator)        分组符
0001,1110        30        1E        RS,(record,separator)        记录分离符
0001,1111        31        1F        US,(unit,separator)        单元分隔符
0010,0000        32        20        (space)        空格
0010,0001        33        21        !       
0010,0010        34        22        "       
0010,0011        35        23        #       
0010,0100        36        24        $       
0010,0101        37        25        %       
0010,0110        38        26        &       
0010,0111        39        27        '       
0010,1000        40        28        (       
0010,1001        41        29        )       
0010,1010        42        2A        *       
0010,1011        43        2B        +       
0010,1100        44        2C               
0010,1101        45        2D        -       
0010,1110        46        2E               
00101111        47        2F        /       
00110000        48        30        0       
00110001        49        31        1               
00110010        50        32        2               
00110011        51        33        3               
00110100        52        34        4               
00110101        53        35        5               
00110110        54        36        6               
00110111        55        37        7               
00111000        56        38        8               
00111001        57        39        9               
00111010        58        3A                       
00111011        59        3B                       
00111100        60        3C        <               
00111101        61        3D        =               
00111110        62        3E        >               
00111111        63        3F        ?               
01000000        64        40        @               
01000001        65        41        A               
01000010        66        42        B               
01000011        67        43        C               
01000100        68        44        D               
01000101        69        45        E               
01000110        70        46        F               
01000111        71        47        G               
01001000        72        48        H               
01001001        73        49        I               
01001010        74        4A        J               
01001011        75        4B        K               
01001100        76        4C        L               
01001101        77        4D        M               
01001110        78        4E        N               
01001111        79        4F        O               
01010000        80        50        P               
01010001        81        51        Q               
01010010        82        52        R               
01010011        83        53        S               
01010100        84        54        T               
01010101        85        55        U               
01010110        86        56        V               
01010111        87        57        W               
01011000        88        58        X               
01011001        89        59        Y               
01011010        90        5A        Z               
01011011        91        5B        [               
01011100        92        5C        \               
01011101        93        5D        ]               
01011110        94        5E        ^               
01011111        95        5F        _               
01100000        96        60        `               
01100001        97        61        a               
01100010        98        62        b               
01100011        99        63        c               
01100100        100        64        d               
01100101        101        65        e               
01100110        102        66        f               
01100111        103        67        g               
01101000        104        68        h               
01101001        105        69        i               
01101010        106        6A        j               
01101011        107        6B        k               
01101100        108        6C        l               
01101101        109        6D        m               
01101110        110        6E        n               
01101111        111        6F        o               
01110000        112        70        p               
01110001        113        71        q               
01110010        114        72        r               
01110011        115        73        s               
01110100        116        74        t               
01110101        117        75        u               
01110110        118        76        v               
01110111        119        77        w               
01111000        120        78        x               
01111001        121        79        y               
01111010        122        7A        z               
01111011        123        7B        {               
01111100        124        7C        |               
01111101        125        7D        }               
01111110        126        7E        ~               
01111111        127        7F        DEL,(delete)        删除       
八进制

十六进制

十进制

字符

八进制

十六进制

十进制

字符

0        0        0        nul        100        40        64        @
1        1        1        soh        101        41        65        A
2        2        2        stx        102        42        66        B
3        3        3        etx        103        43        67        C
4        4        4        eot        104        44        68        D
5        5        5        enq        105        45        69        E
6        6        6        ack        106        46        70        F
7        7        7        bel        107        47        71        G
10        8        8        bs        110        48        72        H
11        9        9        ht        111        49        73        I
12        0a        10        nl        112        4a        74        J
13        0b        11        vt        113        4b        75        K
14        0c        12        ff        114        4c        76        L
15        0d        13        er        115        4d        77        M
16        0e        14        so        116        4e        78        N
17        0f        15        si        117        4f        79        O
20        10        16        dle        120        50        80        P
21        11        17        dc1        121        51        81        Q
22        12        18        dc2        122        52        82        R
23        13        19        dc3        123        53        83        S
24        14        20        dc4        124        54        84        T
25        15        21        nak        125        55        85        U
26        16        22        syn        126        56        86        V
27        17        23        etb        127        57        87        W
30        18        24        can        130        58        88        X
31        19        25        em        131        59        89        Y
32        1a        26        sub        132        5a        90        Z
33        1b        27        esc        133        5b        91        [
34        1c        28        fs        134        5c        92        \
35        1d        29        gs        135        5d        93        ]
36        1e        30        re        136        5e        94        ^
37        1f        31        us        137        5f        95        _
40        20        32        sp        140        60        96        '
41        21        33        !        141        61        97        a
42        22        34        "        142        62        98        b
43        23        35        #        143        63        99        c
44        24        36        $        144        64        100        d
45        25        37        %        145        65        101        e
46        26        38        &        146        66        102        f
47        27        39        `        147        67        103        g
50        28        40        (        150        68        104        h
51        29        41        )        151        69        105        i
52        2a        42        *        152        6a        106        j
53        2b        43        +        153        6b        107        k
54        2c        44                154        6c        108        l
55        2d        45        -        155        6d        109        m
56        2e        46                156        6e        110        n
57        2f        47        /        157        6f        111        o
60        30        48        0        160        70        112        p
61        31        49        1        161        71        113        q
62        32        50        2        162        72        114        r
63        33        51        3        163        73        115        s
64        34        52        4        164        74        116        t
65        35        53        5        165        75        117        u
66        36        54        6        166        76        118        v
67        37        55        7        167        77        119        w
70        38        56        8        170        78        120        x
71        39        57        9        171        79        121        y
72        3a        58                172        7a        122        z
73        3b        59                173        7b        123        {
74        3c        60        <        174        7c        124        |
75        3d        61        =        175        7d        125        }
76        3e        62        >        176        7e        126        ~
77        3f        63        ?        177        7f        127        del
5 大小规则 编辑
1)数字0~9比字母要小。如"7"<"F";

2)数字0比数字9要小,并按0到9顺序递增。如"3"<"8"

3)字母A比字母Z要小,并按A到Z顺序递增。如"A"<"Z"

4)同个字母的大写字母比小写字母要小。如"A"<"a"。

记住几个常见字母的ASCII码大小:

“换行LF”为0x0A;“回车CR”为0x0D;空格为0x20;"0"为0x30; "A"为0x41;"a"为0x61。

另外还有128-255的ASCII字符查询ASCII技巧方便查询ASCII码对应的字符:新建一个文本文档,按住ALT+要查询的码值(注意,这里是十进制)

松开即可显示出对应字符。例如:按住ALT+97,则会显示出‘a'。

6 国际问题 编辑
  ASCII是美国标准,所以它不能良好满足其它讲英语国家的需要。例如英国的英镑符号(£)在哪里?

  拉丁语字母表重音符号

  使用斯拉夫字母表的希腊语、希伯来语、阿拉伯语和俄语。

  汉字系统的中国象形汉字,日本和朝鲜。

  1967年,国际标准化组织(ISO:International Standards Organization)推荐一个ASCII的变种,

  代码0x40、0x5B、0x5C、0x5D、0x7B、0x7C和0x7D“为国家使用保留”,而代码0x5E、0x60和0x7E标为

  “当国内要求的特殊字符需要8、9或10个空间位置时,可用于其它图形符号”。这显然不是一个最佳的国际解决方案,

  因为这并不能保证一致性。但这却显示了人们如何想尽办法为不同的语言来编码的。

扩展ASCII[2]

1981年IBM PC ROM256个字符的字符集,即IBM扩展字符集


ASCII1985年11 Windows字符集被称作“ANSI字符集”,遵循了ANSI草案和ISO标准(ANSI/ISO8859-1-1987,简“Latin 1”。

ANSI字符集的最初版本:

1987年4月代码页437,字符的映像代码,出现在MS-DOS3。3

扩展ASCII 字符是从128 到255(0x80-0xff)的字符。

双字节字符集[3]

双字节字符集(DBCS:double-byte character set),解决中国、日本和韩国的象形文字符和ASCII的某种兼容性。

DBCS从256代码开始,就像ASCII一样。与任何行为良好的代码页一样,最初的128个代码是ASCII。

然而,较高的128个代码中的某些总是跟随着第二个字节。

这两个字节一起(称作首字节和跟随字节)定义一个字符,通常是一个复杂的象形文字。

7 键盘常用 编辑
  ESC键 VK_ESCAPE (27)

  回车键: VK_RETURN (13)

  TAB键: VK_TAB (9)

  Caps Lock键: VK_CAPITAL (20)

  Shift键: VK_SHIFT (16)

  Ctrl键: VK_CONTROL (17)

  Alt键: VK_MENU (18)

  空格键: VK_SPACE (32)

  退格键: VK_BACK (8)

  左徽标键: VK_LWIN (91)

  右徽标键: VK_LWIN (92)

  鼠标右键快捷键:VK_APPS (93)

  Insert键: VK_INSERT (45)

  Home键: VK_HOME (36)

  Page Up: VK_PRIOR (33)

  PageDown: VK_NEXT (34)

  End键: VK_END (35)

  Delete键: VK_DELETE (46)

  方向键(←): VK_LEFT (37)

  方向键(↑): VK_UP (38)

  方向键(→): VK_RIGHT (39)

  方向键(↓): VK_DOWN (40)

  F1键: VK_F1 (112)

  F2键: VK_F2 (113)

  F3键: VK_F3 (114)

  F4键: VK_F4 (115)

  F5键: VK_F5 (116)

  F6键: VK_F6 (117)

  F7键: VK_F7 (118)

  F8键: VK_F8 (119)

  F9键: VK_F9 (120)

  F10键: VK_F10 (121)

  F11键: VK_F11 (122)

  F12键: VK_F12 (123)

  Num Lock键: VK_NUMLOCK (144)

  小键盘0: VK_NUMPAD0 (96)

  小键盘1: VK_NUMPAD0 (97)

  小键盘2: VK_NUMPAD0 (98)

  小键盘3: VK_NUMPAD0 (99)

  小键盘4: VK_NUMPAD0 (100)

  小键盘5: VK_NUMPAD0 (101)

  小键盘6: VK_NUMPAD0 (102)

  小键盘7: VK_NUMPAD0 (103)

  小键盘8: VK_NUMPAD0 (104)

  小键盘9: VK_NUMPAD0 (105)

  小键盘。: VK_DECIMAL (110)

  小键盘*: VK_MULTIPLY (106)

  小键盘+: VK_MULTIPLY (107)

  小键盘-: VK_SUBTRACT (109)

  小键盘/: VK_DIVIDE (111)

  Pause Break键: VK_PAUSE (19)

  Scroll Lock键: VK_SCROLL (145)

8 代码算法 编辑
  在ascii中定义为01000001,也就是十进制65,有了这个标准后,当我们输入A时,计算机就可以通过ascii码知道输入的字符的二进制编码是01000001。而没有这样的标准,我们就必须自己想办法告诉计算机我们输入了一个A;没有这样的标准,我们在别的机器上就需要重新编码以告诉计算机我们要输入A。ascii码指的不是十进制,是二进制。只是用十进制表示习惯一点罢了,比如在ascii码中,A的二进制编码为01000001,如果用十进制表示是65,用十六进制表示就是41H。

ASCII非打印控制字符表

  在ascii码表中,只包括了一些字符、数字、标点符号的信息表示,这主要是因为计算机是美国发明的,在英文下面,我们使用ascii表示就足够了!但是在汉字输入下面,用ascii码就不能表示了,而汉字只是中国的通用表示,所以如果我们要在计算机中输入汉字,就必须有一个像ascii码的标准来表示每一个汉字,这就是中国的汉字国标码,它定义了汉字在计算机中的一个表示标准。通过这个标准,但我们输入汉字的时候,我们的输入码就转换为区位码,通过唯一的区位码得到这个汉字的字形码并显示出来。当然汉字的区位码在计算机中也是用二进制表示的!

一、二进制数转换为十进制数

  二进制数第0位的权值是2的0次方,第1位的权值是2的1次方……

  所以,设有一个二进制数:0110 0100,转换为10进制为:

  下面是竖式:

  0110 0100 换算成 十进制

  第0位 0 * 20 = 0

  第1位 0 * 21 = 0

  第2位 1 * 22 = 4

  第3位 0 * 23 = 0

  第4位 0 * 24 = 0

  第5位 1 * 25 = 32

  第6位 1 * 26 = 64

  第7位 0 * 27 = 0 +

  ---------------------------

  100

  用横式计算为:

  0 * 20 + 0 * 21 + 1 * 22 + 1 * 23 + 0 * 24 + 1 * 25 + 1 * 26 + 0 * 27 = 100

  0乘以多少都是0,所以我们也可以直接跳过值为0的位:

  1 * 22 + 1 * 23 + 1 * 25 + 1 * 26 = 100

二、八进制数转换为十进制数

  八进制就是逢8进1。

  八进制数采用 0~7这八数来表达一个数。

  八进制数第0位的权值为8的0次方,第1位权值为8的1次方,第2位权值为8的2次方……

  所以,设有一个八进制数:1507,转换为十进制为:

  用竖式表示:

  1507换算成十进制。

  第0位 7 * 80 = 7

  第1位 0 * 81 = 0

  第2位 5 * 82 = 320

  第3位 1 * 83 = 512 +

  --------------------------

  839

  同样,我们也可以用横式直接计算:

  7 * 80 + 0 * 81 + 5 * 82 + 1 * 83 = 839

  结果是,八进制数 1507 转换成十进制数为 839

八进制数的表达方法

  C,C++语言中,如何表达一个八进制数呢?如果这个数是 876,我们可以断定它不是八进制数,因为八进制数中不可能出7以上的阿拉伯数字。但如果这个数是123、是567,或12345670,那么它是八进制数还是10进制数,都有可能。

  所以,C,C++规定,一个数如果要指明它采用八进制,必须在它前面加上一个0,如:123是十进制,但0123则表示采用八进制。这就是八进制数在C、C++中的表达方法。

  由于C和C++都没有提供二进制数的表达方法,所以,这里所学的八进制是我们学习的,CtC++语言的数值表达的第二种进制法。

  现在,对于同样一个数,比如是100,我们在代码中可以用平常的10进制表达,例如在变量初始化时:

  int a = 100;

  我们也可以这样写:

  int a = 0144; //0144是八进制的100;一个10进制数如何转成8进制,我们后面会学到。

  千万记住,用八进制表达时,你不能少了最前的那个0。否则计算机会通通当成10进制。不过,有一个地方使用八进制数时,却不能使用加0,那就是我们前面学的用于表达字符的“转义符”表达法。

八进制数在转义符中的使用

  我们学过用一个转义符'\'加上一个特殊字母来表示某个字符的方法,如:'\n'表示换行(line),而'\t'表示Tab字符,'\''则表示单引号。今天我们又学习了一种使用转义符的方法:转义符'\'后面接一个八进制数,用于表示ASCII码等于该值的字符。

  比如,查一下第5章中的ASCII码表,我们找到问号字符(?)的ASCII值是63,那么我们可以把它转换为八进值:77,然后用 '\77'来表示'?'。由于是八进制,所以本应写成 '\077',但因为C,C++规定不允许使用斜杠加10进制数来表示字符,所以这里的0可以不写。

  事实上我们很少在实际编程中非要用转义符加八进制数来表示一个字符,所以,6。2。4小节的内容,大家仅仅了解就行。

十六进制数转换成十进制数

  2进制,用两个阿拉伯数字:0、1;

  8进制,用八个阿拉伯数字:0、1、2、3、4、5、6、7;

  10进制,用十个阿拉伯数字:0到9;

  16进制,用十六个阿拉伯数字……等等,阿拉伯人或说是印度人,只发明了10个数字啊?

  16进制就是逢16进1,但我们只有0~9这十个数字,所以我们用A,B,C,D,E,F这五个字母来分别表示10,11,12,13,14,15。字母不区分大小写。

  十六进制数的第0位的权值为16的0次方,第1位的权值为16的1次方,第2位的权值为16的2次方……

  所以,在第N(N从0开始)位上,如果是是数 X (X 大于等于0,并且X小于等于 15,即:F)表示的大小为 X * 16的N次方。

  假设有一个十六进数 2AF5, 那么如何换算成10进制呢?

  用竖式计算:

  2AF5换算成10进制:

  第0位: 5 * 160 = 5

  第1位: F * 161 = 240

  第2位: A * 162 = 2560

  第3位: 2 * 163 = 8192 +


ASCII  -------------------------------------

  10997

  直接计算就是:

  5 * 160 + F * 161 + A * 162 + 2 * 163 = 10997

  (别忘了,在上面的计算中,A表示10,而F表示15)

  现在可以看出,所有进制换算成10进制,关键在于各自的权值不同。

  假设有人问你,十进数 1234 为什么是 一千二百三十四?你尽可以给他这么一个算式:

  1234 = 1 * 103 + 2 * 102 + 3 * 101 + 4 * 100

十六进制数的表达方法

  如果不使用特殊的书写形式,16进制数也会和10进制相混。随便一个数:9876,就看不出它是16进制或10进制。

  C,C++规定,16进制数必须以 0x开头。比如 0x1表示一个16进制数。而1则表示一个十进制。另外如:0xff,0xFF,0X102A,等等。其中的x也也不区分大小写。(注意:0x中的0是数字0,而不是字母O)

  以下是一些用法示例:

  int a = 0x100F;

  int b = 0x70 + a;

  至此,我们学完了所有进制:10进制,8进制,16进制数的表达方式。最后一点很重要,C/C++中,10进制数有正负之分,比如12表示正12,而-12表示负12,;但8进制和16进制只能用达无符号的正整数,如果你在代码中里:-078,或者写:-0xF2,C,C++并不把它当成一个负数。

十六进制数在转义符中的使用

  转义符也可以接一个16进制数来表示一个字符。如在6。2。4小节中说的 '?' 字符,可以有以下表达方式:

  '?' //直接输入字符

  '\77' //用八进制,此时可以省略开头的0

  '\0x3F' //用十六进制

  同样,这一小节只用于了解。除了空字符用八进制数 '\0' 表示以外,我们很少用后两种方法表示一个字符。

三、十进制数转换到二、八、十六进制数

  进制数转换为2进制数

  给你一个十进制,比如:6,如果将它转换成二进制数呢?

  10进制数转换成二进制数,这是一个连续除2的过程:

  把要转换的数,除以2,得到商和余数,

  将商继续除以2,直到商为0。最后将所有余数倒序排列,得到数就是转换结果。

  听起来有些糊涂?我们结合例子来说明。比如要转换6为二进制数。

  “把要转换的数,除以2,得到商和余数”。

  那么:

  要转换的数是6, 6 ÷ 2,得到商是3,余数是0。 (不要告诉我你不会计算6÷3!)

  “将商继续除以2,直到商为0……”

  现在商是3,还不是0,所以继续除以2。

  那就: 3 ÷ 2, 得到商是1,余数是1。

  “将商继续除以2,直到商为0……”

  现在商是1,还不是0,所以继续除以2。

  那就: 1 ÷ 2, 得到商是0,余数是1 (拿笔纸算一下,1÷2是不是商0余1!)

  “将商继续除以2,直到商为0……最后将所有余数倒序排列”

  好极!现在商已经是0。

  我们三次计算依次得到余数分别是:0、1、1,将所有余数倒序排列,那就是:110了!

  6转换成二进制,结果是110。

  把上面的一段改成用表格来表示,则为:

  被除数 计算过程 商 余数

  6 6/2 3 0

  3 3/2 1 1

  1 1/2 0 1

  (在计算机中,÷用 / 来表示)

  如果是在考试时,我们要画这样表还是有点费时间,所更常见的换算过程是使用下图的连除:

  (图:1)

  请大家对照图,表,及文字说明,并且自已拿笔计算一遍如何将6转换为二进制数。

  说了半天,我们的转换结果对吗?二进制数110是6吗?你已经学会如何将二进制数转换成10进制数了,所以请现在就计算一下110换成10进制是否就是6。

  6。3。2 10进制数转换为8、16进制数

  非常开心,10进制数转换成8进制的方法,和转换为2进制的方法类似,惟一变化:除数由2变成8。

  来看一个例子,如何将十进制数120转换成八进制数。

  用表格表示:

  被除数 计算过程 商 余数

  120 120/8 15 0

  15 15/8 1 7

  1 1/8 0 1

  120转换为8进制,结果为:170。

  非常非常开心,10进制数转换成16进制的方法,和转换为2进制的方法类似,惟一变化:除数由2变成16。

  同样是120,转换成16进制则为:

  被除数 计算过程 商 余数

  120 120/16 7 8

  7 7/16 0 7

  120转换为16进制,结果为:78。

  请拿笔纸,采用(图:1)的形式,演算上面两个表的过程。

四、十六进制数互相转换

  二进制和十六进制的互相转换比较重要。不过这二者的转换却不用计算,每个C,C++程序员都能做到看见二进制数,直接就能转换为十六进制数,反之亦然。

  我们也一样,只要学完这一小节,就能做到。

  首先我们来看一个二进制数:1111,它是多少呢?

  你可能还要这样计算:1 * 20 + 1 * 21 + 1 * 22 + 1 * 23 = 1 * 1 + 1 * 2 + 1 * 4 + 1 * 8 = 15。

  然而,由于1111才4位,所以我们必须直接记住它每一位的权值,并且是从高位往低位记,:8、4、2、1。即,最高位的权值为23 = 8,然后依次是 22 = 4,21=2, 20 = 1。

  记住8421,对于任意一个4位的二进制数,我们都可以很快算出它对应的10进制值。

  下面列出四位二进制数 xxxx 所有可能的值(中间略过部分)

  仅4位的2进制数 快速计算方法 十进制值 十六进值

  1111 = 8 + 4 + 2 + 1 = 15 F

  1110 = 8 + 4 + 2 + 0 = 14 E

  1101 = 8 + 4 + 0 + 1 = 13 D

  1100 = 8 + 4 + 0 + 0 = 12 C

  1011 = 8 + 4 + 0 + 1 = 11 B

  1010 = 8 + 0 + 2 + 0 = 10 A

  1001 = 8 + 0 + 0 + 1 = 10 9

  。。。。

  0001 = 0 + 0 + 0 + 1 = 1 1

  0000 = 0 + 0 + 0 + 0 = 0 0

  二进制数要转换为十六进制,就是以4位一段,分别转换为十六进制。

  如(上行为二制数,下面为对应的十六进制):

  1111 1101 , 1010 0101 , 1001 1011

  F D , A 5 , 9 B

  反过来,当我们看到 FD时,如何迅速将它转换为二进制数呢?

  先转换F:

  看到F,我们需知道它是15(可能你还不熟悉A~F这五个数),然后15如何用8421凑呢?应该是8 + 4 + 2 + 1,所以四位全为1 :1111。

  接着转换 D:

  看到D,知道它是13,13如何用8421凑呢?应该是:8 + 4 + 1,即:1101。

  所以,FD转换为二进制数,为: 1111 1101

  由于十六进制转换成二进制相当直接,所以,我们需要将一个十进制数转换成2进制数时,也可以先转换成16进制,然后再转换成2进制。

  比如,十进制数 1234转换成二制数,如果要一直除以2,直接得到2进制数,需要计算较多次数。所以我们可以先除以16,得到16进制数:


ASCII
被除数 计算过程 商 余数

  1234 1234/16 77 2

  77 77/16 4 13 (D)

  4 4/16 0 4

  结果16进制为: 0x4D2

  然后我们可直接写出0x4D2的二进制形式: 0100 1011 0010。

  其中对映关系为:

  0100 -- 4

  1011 -- D

  0010 -- 2

  同样,如果一个二进制数很长,我们需要将它转换成10进制数时,除了前面学过的方法是,我们还可以先将这个二进制转换成16进制,然后再转换为10进制。

  下面举例一个int类型的二进制数:

  01101101 11100101 10101111 00011011

  我们按四位一组转换为16进制: 6D E5 AF 1B

9 汉字编码 编辑
0-127 是 7位ASCII 码的范围,是国际标准。

至于汉字,不同的字符集用的ascii 码的范围也不一样,常用的汉字字符集有GB2312-80,GBK,

Big5,unicode 等。下面我重点说一说最常用的GB_2312 的字符集。

GB_2312 字符集是目前最常用的汉字编码标准,windows 95/98/2000 中使用的 GBK字符集 就包含了GB2312,或者说和GB2312 兼容,GB_2312 字符集包含了 6763个的 简体汉字,和682 个标准中文符号。在这个标准中,每个汉字用2个字节来表示,每个字节的ascii码为 161-254 (16 进制A1 - FE),第一个字节 对应于 区码的1-94 区,第二个字节 对应于位码的1-94 位。

161-254 其实很好记忆,大家知道英文字符中,可打印的字符范围为33-126。将 这对 数加上

128(或者说最高位置1),就得到汉字使用的字符的范围。

//GB18030的规范是汉字第一个字节在0x81-0xFE之间,第二个字节位于区间0x40-0x7E以及0x80-0xFE。每个字节转化为整数大于128。

if ((char_temp>=0x81)&&(char_temp<=0xFE))

{

if(*len

{

*len+=1;

*p_temp++=char_temp;

_putch(char_temp);

x++;

}

}

参考资料:
1.
ASCII码表 0-127
http://www.asciima.com/
2.
扩展ASCII打印字符
http://www.asciima.com/ascii/4.html
3.
ASCII非打印控制字符表
http://www.asciima.com/ascii/2.html
扩展阅读:
1.
美国标准信息交换码
http://www.360doc.com/content/10/1207/11/3945310_75772859.shtml
2.
ASCII码对照表 ASCII控制字符
http://ascii.911cha.com/



1<词>,2[句],3/段\,4{节},5(章)。
2016-2-6 23:26
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zzz19760225
超级版主




积分 3673
发帖 2020
注册 2016-2-1
状态 离线
『第 17 楼』:  

ASCII值        控制字符        ASCII值        控制字符        ASCII值        控制字符        ASCII值        控制字符
0        NUT        32        (space)        64        @        96        、
1        SOH        33        !        65        A        97        a
2        STX        34        "        66        B        98        b
3        ETX        35        #        67        C        99        c
4        EOT        36        $        68        D        100        d
5        ENQ        37        %        69        E        101        e
6        ACK        38        &        70        F        102        f
7        BEL        39        ,        71        G        103        g
8        BS        40        (        72        H        104        h
9        HT        41        )        73        I        105        i
10        LF        42        *        74        J        106        j
11        VT        43        +        75        K        107        k
12        FF        44        ,        76        L        108        l
13        CR        45        -        77        M        109        m
14        SO        46        .        78        N        110        n
15        SI        47        /        79        O        111        o
16        DLE        48        0        80        P        112        p
17        DCI        49        1        81        Q        113        q
18        DC2        50        2        82        R        114        r
19        DC3        51        3        83        S        115        s
20        DC4        52        4        84        T        116        t
21        NAK        53        5        85        U        117        u
22        SYN        54        6        86        V        118        v
23        TB        55        7        87        W        119        w
24        CAN        56        8        88        X        120        x
25        EM        57        9        89        Y        121        y
26        SUB        58        :        90        Z        122        z
27        ESC        59        ;        91        [        123        {
28        FS        60        <        92        /        124        |
29        GS        61        =        93        ]        125        }
30        RS        62        >        94        ^        126        `
31        US        63        ?        95        _        127        DEL
特殊字符解释
NUL空        VT 垂直制表        SYN 空转同步
STX 正文开始        CR 回车        CAN 作废
ETX 正文结束        SO 移位输出        EM 纸尽
EOY 传输结束        SI 移位输入        SUB 换置
ENQ 询问字符        DLE 空格        ESC 换码
ACK 承认        DC1 设备控制1        FS 文字分隔符
BEL 报警        DC2 设备控制2        GS 组分隔符
BS 退一格        DC3 设备控制3        RS 记录分隔符
HT 横向列表        DC4 设备控制4        US 单元分隔符
LF 换行        NAK 否定        DEL 删除



1<词>,2[句],3/段\,4{节},5(章)。
2016-2-6 23:53
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zzz19760225
超级版主




积分 3673
发帖 2020
注册 2016-2-1
状态 离线
『第 18 楼』:  

英文名称        R.G.B        16色        实色效果        英文名称        R.G.B        16色
Snow        255 250 250        #FFFAFA                PaleTurquoise1        187 255 255        #BBFFFF
GhostWhite        248 248 255        #F8F8FF                PaleTurquoise2        174 238 238        #AEEEEE
WhiteSmoke        245 245 245        #F5F5F5                PaleTurquoise3        150 205 205        #96CDCD
Gainsboro        220 220 220        #DCDCDC                PaleTurquoise4        102 139 139        #668B8B
FloralWhite        255 250 240        #FFFAF0                CadetBlue1        152 245 255        #98F5FF
OldLace        253 245 230        #FDF5E6                CadetBlue2        142 229 238        #8EE5EE
Linen        250 240 230        #FAF0E6                CadetBlue3        122 197 205        #7AC5CD
AntiqueWhite        250 235 215        #FAEBD7                CadetBlue4        83 134 139        #53868B
PapayaWhip        255 239 213        #FFEFD5                Turquoise1        0 245 255        #00F5FF
BlanchedAlmond        255 235 205        #FFEBCD                Turquoise2        0 229 238        #00E5EE
Bisque        255 228 196        #FFE4C4                Turquoise3        0 197 205        #00C5CD
PeachPuff        255 218 185        #FFDAB9                Turquoise4        0 134 139        #00868B
NavajoWhite        255 222 173        #FFDEAD                Cyan1        0 255 255        #00FFFF
Moccasin        255 228 181        #FFE4B5                Cyan2        0 238 238        #00EEEE
Cornsilk        255 248 220        #FFF8DC                Cyan3        0 205 205        #00CDCD
Ivory        255 255 240        #FFFFF0                Cyan4        0 139 139        #008B8B
LemonChiffon        255 250 205        #FFFACD                DarkSlateGray1        151 255 255        #97FFFF
Seashell        255 245 238        #FFF5EE                DarkSlateGray2        141 238 238        #8DEEEE
Honeydew        240 255 240        #F0FFF0                DarkSlateGray3        121 205 205        #79CDCD
MintCream        245 255 250        #F5FFFA                DarkSlateGray4        82 139 139        #528B8B
Azure        240 255 255        #F0FFFF                Aquamarine1        127 255 212        #7FFFD4
AliceBlue        240 248 255        #F0F8FF                Aquamarine2        118 238 198        #76EEC6
lavender        230 230 250        #E6E6FA                Aquamarine3        102 205 170        #66CDAA
LavenderBlush        255 240 245        #FFF0F5                Aquamarine4        69 139 116        #458B74
MistyRose        255 228 225        #FFE4E1                DarkSeaGreen1        193 255 193        #C1FFC1
White        255 255 255        #FFFFFF                DarkSeaGreen2        180 238 180        #B4EEB4
Black        0 0 0        #000000                DarkSeaGreen3        155 205 155        #9BCD9B
DarkSlateGray        47 79 79        #2F4F4F                DarkSeaGreen4        105 139 105        #698B69
DimGrey        105 105 105        #696969                SeaGreen1        84 255 159        #54FF9F
SlateGrey        112 128 144        #708090                SeaGreen2        78 238 148        #4EEE94
LightSlateGray        119 136 153        #778899                SeaGreen3        67 205 128        #43CD80
Grey        190 190 190        #BEBEBE                SeaGreen4        46 139 87        #2E8B57
LightGray        211 211 211        #D3D3D3                PaleGreen1        154 255 154        #9AFF9A
MidnightBlue        25 25 112        #191970                PaleGreen2        144 238 144        #90EE90
NavyBlue        0 0 128        #000080                PaleGreen3        124 205 124        #7CCD7C
CornflowerBlue        100 149 237        #6495ED                PaleGreen4        84 139 84        #548B54
DarkSlateBlue        72 61 139        #483D8B                SpringGreen1        0 255 127        #00FF7F
SlateBlue        106 90 205        #6A5ACD                SpringGreen2        0 238 118        #00EE76
MediumSlateBlue        123 104 238        #7B68EE                SpringGreen3        0 205 102        #00CD66
LightSlateBlue        132 112 255        #8470FF                SpringGreen4        0 139 69        #008B45
MediumBlue        0 0 205        #0000CD                Green1        0 255 0        #00FF00
RoyalBlue        65 105 225        #4169E1                Green2        0 238 0        #00EE00
Blue        0 0 255        #0000FF                Green3        0 205 0        #00CD00
DodgerBlue        30 144 255        #1E90FF                Green4        0 139 0        #008B00
DeepSkyBlue        0 191 255        #00BFFF                Chartreuse1        127 255 0        #7FFF00
SkyBlue        135 206 235        #87CEEB                Chartreuse2        118 238 0        #76EE00
LightSkyBlue        135 206 250        #87CEFA                Chartreuse3        102 205 0        #66CD00
SteelBlue        70 130 180        #4682B4                Chartreuse4        69 139 0        #458B00
LightSteelBlue        176 196 222        #B0C4DE                OliveDrab1        192 255 62        #C0FF3E
LightBlue        173 216 230        #ADD8E6                OliveDrab2        179 238 58        #B3EE3A
PowderBlue        176 224 230        #B0E0E6                OliveDrab3        154 205 50        #9ACD32
PaleTurquoise        175 238 238        #AFEEEE                OliveDrab4        105 139 34        #698B22
DarkTurquoise        0 206 209        #00CED1                DarkOliveGreen1        202 255 112        #CAFF70
MediumTurquoise        72 209 204        #48D1CC                DarkOliveGreen2        188 238 104        #BCEE68
Turquoise        64 224 208        #40E0D0                DarkOliveGreen3        162 205 90        #A2CD5A
Cyan        0 255 255        #00FFFF                DarkOliveGreen4        110 139 61        #6E8B3D
LightCyan        224 255 255        #E0FFFF                Khaki1        255 246 143        #FFF68F
CadetBlue        95 158 160        #5F9EA0                Khaki2        238 230 133        #EEE685
MediumAquamarine        102 205 170        #66CDAA                Khaki3        205 198 115        #CDC673
Aquamarine        127 255 212        #7FFFD4                Khaki4        139 134 78        #8B864E
DarkGreen        0 100 0        #006400                LightGoldenrod1        255 236 139        #FFEC8B
DarkOliveGreen        85 107 47        #556B2F                LightGoldenrod2        238 220 130        #EEDC82
DarkSeaGreen        143 188 143        #8FBC8F                LightGoldenrod3        205 190 112        #CDBE70
SeaGreen        46 139 87        #2E8B57                LightGoldenrod4        139 129 76        #8B814C
MediumSeaGreen        60 179 113        #3CB371                LightYellow1        255 255 224        #FFFFE0
LightSeaGreen        32 178 170        #20B2AA                LightYellow2        238 238 209        #EEEED1
PaleGreen        152 251 152        #98FB98                LightYellow3        205 205 180        #CDCDB4
SpringGreen        0 255 127        #00FF7F                LightYellow4        139 139 122        #8B8B7A
LawnGreen        124 252 0        #7CFC00                Yellow1        255 255 0        #FFFF00
Green        0 255 0        #00FF00                Yellow2        238 238 0        #EEEE00
Chartreuse        127 255 0        #7FFF00                Yellow3        205 205 0        #CDCD00
MedSpringGreen        0 250 154        #00FA9A                Yellow4        139 139 0        #8B8B00
GreenYellow        173 255 47        #ADFF2F                Gold1        255 215 0        #FFD700
LimeGreen        50 205 50        #32CD32                Gold2        238 201 0        #EEC900
YellowGreen        154 205 50        #9ACD32                Gold3        205 173 0        #CDAD00
ForestGreen        34 139 34        #228B22                Gold4        139 117 0        #8B7500
OliveDrab        107 142 35        #6B8E23                Goldenrod1        255 193 37        #FFC125
DarkKhaki        189 183 107        #BDB76B                Goldenrod2        238 180 34        #EEB422
PaleGoldenrod        238 232 170        #EEE8AA                Goldenrod3        205 155 29        #CD9B1D
LtGoldenrodYello        250 250 210        #FAFAD2                Goldenrod4        139 105 20        #8B6914
LightYellow        255 255 224        #FFFFE0                DarkGoldenrod1        255 185 15        #FFB90F
Yellow        255 255 0        #FFFF00                DarkGoldenrod2        238 173 14        #EEAD0E
Gold        255 215 0        #FFD700                DarkGoldenrod3        205 149 12        #CD950C
LightGoldenrod        238 221 130        #EEDD82                DarkGoldenrod4        139 101 8        #8B658B
goldenrod        218 165 32        #DAA520                RosyBrown1        255 193 193        #FFC1C1
DarkGoldenrod        184 134 11        #B8860B                RosyBrown2        238 180 180        #EEB4B4
RosyBrown        188 143 143        #BC8F8F                RosyBrown3        205 155 155        #CD9B9B
IndianRed        205 92 92        #CD5C5C                RosyBrown4        139 105 105        #8B6969
SaddleBrown        139 69 19        #8B4513                IndianRed1        255 106 106        #FF6A6A
Sienna        160 82 45        #A0522D                IndianRed2        238 99 99        #EE6363
Peru        205 133 63        #CD853F                IndianRed3        205 85 85        #CD5555
Burlywood        222 184 135        #DEB887                IndianRed4        139 58 58        #8B3A3A
Beige        245 245 220        #F5F5DC                Sienna1        255 130 71        #FF8247
Wheat        245 222 179        #F5DEB3                Sienna2        238 121 66        #EE7942
SandyBrown        244 164 96        #F4A460                Sienna3        205 104 57        #CD6839
Tan        210 180 140        #D2B48C                Sienna4        139 71 38        #8B4726
Chocolate        210 105 30        #D2691E                Burlywood1        255 211 155        #FFD39B
Firebrick        178 34 34        #B22222                Burlywood2        238 197 145        #EEC591
Brown        165 42 42        #A52A2A                Burlywood3        205 170 125        #CDAA7D
DarkSalmon        233 150 122        #E9967A                Burlywood4        139 115 85        #8B7355
Salmon        250 128 114        #FA8072                Wheat1        255 231 186        #FFE7BA
LightSalmon        255 160 122        #FFA07A                Wheat2        238 216 174        #EED8AE
Orange        255 165 0        #FFA500                Wheat3        205 186 150        #CDBA96
DarkOrange        255 140 0        #FF8C00                Wheat4        139 126 102        #8B7E66
Coral        255 127 80        #FF7F50                Tan1        255 165 79        #FFA54F
LightCoral        240 128 128        #F08080                Tan2        238 154 73        #EE9A49
Tomato        255 99 71        #FF6347                Tan3        205 133 63        #CD853F
OrangeRed        255 69 0        #FF4500                Tan4        139 90 43        #8B5A2B
Red        255 0 0        #FF0000                Chocolate1        255 127 36        #FF7F24
HotPink        255 105 180        #FF69B4                Chocolate2        238 118 33        #EE7621
DeepPink        255 20 147        #FF1493                Chocolate3        205 102 29        #CD661D
Pink        255 192 203        #FFC0CB                Chocolate4        139 69 19        #8B4513
LightPink        255 182 193        #FFB6C1                Firebrick1        255 48 48        #FF3030
PaleVioletRed        219 112 147        #DB7093                Firebrick2        238 44 44        #EE2C2C
Maroon        176 48 96        #B03060                Firebrick3        205 38 38        #CD2626
MediumVioletRed        199 21 133        #C71585                Firebrick4        139 26 26        #8B1A1A
VioletRed        208 32 144        #D02090                Brown1        255 64 64        #FF4040
Magenta        255 0 255        #FF00FF                Brown2        238 59 59        #EE3B3B
Violet        238 130 238        #EE82EE                Brown3        205 51 51        #CD3333
Plum        221 160 221        #DDA0DD                Brown4        139 35 35        #8B2323
Orchid        218 112 214        #DA70D6                Salmon1        255 140 105        #FF8C69
MediumOrchid        186 85 211        #BA55D3                Salmon2        238 130 98        #EE8262
DarkOrchid        153 50 204        #9932CC                Salmon3        205 112 84        #CD7054
DarkViolet        148 0 211        #9400D3                Salmon4        139 76 57        #8B4C39
BlueViolet        138 43 226        #8A2BE2                LightSalmon1        255 160 122        #FFA07A
Purple        160 32 240        #A020F0                LightSalmon2        238 149 114        #EE9572
MediumPurple        147 112 219        #9370DB                LightSalmon3        205 129 98        #CD8162
Thistle        216 191 216        #D8BFD8                LightSalmon4        139 87 66        #8B5742
Snow1        255 250 250        #FFFAFA                Orange1        255 165 0        #FFA500
Snow2        238 233 233        #EEE9E9                Orange2        238 154 0        #EE9A00
Snow3        205 201 201        #CDC9C9                Orange3        205 133 0        #CD8500
Snow4        139 137 137        #8B8989                Orange4        139 90 0        #8B5A00
Seashell1        255 245 238        #FFF5EE                DarkOrange1        255 127 0        #FF7F00
Seashell2        238 229 222        #EEE5DE                DarkOrange2        238 118 0        #EE7600
Seashell3        205 197 191        #CDC5BF                DarkOrange3        205 102 0        #CD6600
Seashell4        139 134 130        #8B8682                DarkOrange4        139 69 0        #8B4500
AntiqueWhite1        255 239 219        #FFEFDB                Coral1        255 114 86        #FF7256
AntiqueWhite2        238 223 204        #EEDFCC                Coral2        238 106 80        #EE6A50
AntiqueWhite3        205 192 176        #CDC0B0                Coral3        205 91 69        #CD5B45
AntiqueWhite4        139 131 120        #8B8378                Coral4        139 62 47        #8B3E2F
Bisque1        255 228 196        #FFE4C4                Tomato1        255 99 71        #FF6347
Bisque2        238 213 183        #EED5B7                Tomato2        238 92 66        #EE5C42
Bisque3        205 183 158        #CDB79E                Tomato3        205 79 57        #CD4F39
Bisque4        139 125 107        #8B7D6B                Tomato4        139 54 38        #8B3626
PeachPuff1        255 218 185        #FFDAB9                OrangeRed1        255 69 0        #FF4500
PeachPuff2        238 203 173        #EECBAD                OrangeRed2        238 64 0        #EE4000
PeachPuff3        205 175 149        #CDAF95                OrangeRed3        205 55 0        #CD3700
PeachPuff4        139 119 101        #8B7765                OrangeRed4        139 37 0        #8B2500
NavajoWhite1        255 222 173        #FFDEAD                Red1        255 0 0        #FF0000
NavajoWhite2        238 207 161        #EECFA1                Red2        238 0 0        #EE0000
NavajoWhite3        205 179 139        #CDB38B                Red3        205 0 0        #CD0000
NavajoWhite4        139 121 94        #8B795E                Red4        139 0 0        #8B0000
LemonChiffon1        255 250 205        #FFFACD                DeepPink1        255 20 147        #FF1493
LemonChiffon2        238 233 191        #EEE9BF                DeepPink2        238 18 137        #EE1289
LemonChiffon3        205 201 165        #CDC9A5                DeepPink3        205 16 118        #CD1076
LemonChiffon4        139 137 112        #8B8970                DeepPink4        139 10 80        #8B0A50
Cornsilk1        255 248 220        #FFF8DC                HotPink1        255 110 180        #FF6EB4
Cornsilk2        238 232 205        #EEE8CD                HotPink2        238 106 167        #EE6AA7
Cornsilk3        205 200 177        #CDC8B1                HotPink3        205 96 144        #CD6090
Cornsilk4        139 136 120        #8B8878                HotPink4        139 58 98        #8B3A62
Ivory1        255 255 240        #FFFFF0                Pink1        255 181 197        #FFB5C5
Ivory2        238 238 224        #EEEEE0                Pink2        238 169 184        #EEA9B8
Ivory3        205 205 193        #CDCDC1                Pink3        205 145 158        #CD919E
Ivory4        139 139 131        #8B8B83                Pink4        139 99 108        #8B636C
Honeydew1        240 255 240        #F0FFF0                LightPink1        255 174 185        #FFAEB9
Honeydew2        224 238 224        #E0EEE0                LightPink2        238 162 173        #EEA2AD
Honeydew3        193 205 193        #C1CDC1                LightPink3        205 140 149        #CD8C95
Honeydew4        131 139 131        #838B83                LightPink4        139 95 101        #8B5F65
LavenderBlush1        255 240 245        #FFF0F5                PaleVioletRed1        255 130 171        #FF82AB
LavenderBlush2        238 224 229        #EEE0E5                PaleVioletRed2        238 121 159        #EE799F
LavenderBlush3        205 193 197        #CDC1C5                PaleVioletRed3        205 104 137        #CD6889
LavenderBlush4        139 131 134        #8B8386                PaleVioletRed4        139 71 93        #8B475D
MistyRose1        255 228 225        #FFE4E1                Maroon1        255 52 179        #FF34B3
MistyRose2        238 213 210        #EED5D2                Maroon2        238 48 167        #EE30A7
MistyRose3        205 183 181        #CDB7B5                Maroon3        205 41 144        #CD2990
MistyRose4        139 125 123        #8B7D7B                Maroon4        139 28 98        #8B1C62
Azure1        240 255 255        #F0FFFF                VioletRed1        255 62 150        #FF3E96
Azure2        224 238 238        #E0EEEE                VioletRed2        238 58 140        #EE3A8C
Azure3        193 205 205        #C1CDCD                VioletRed3        205 50 120        #CD3278
Azure4        131 139 139        #838B8B                VioletRed4        139 34 82        #8B2252
SlateBlue1        131 111 255        #836FFF                Magenta1        255 0 255        #FF00FF
SlateBlue2        122 103 238        #7A67EE                Magenta2        238 0 238        #EE00EE
SlateBlue3        105 89 205        #6959CD                Magenta3        205 0 205        #CD00CD
SlateBlue4        71 60 139        #473C8B                Magenta4        139 0 139        #8B008B
RoyalBlue1        72 118 255        #4876FF                Orchid1        255 131 250        #FF83FA
RoyalBlue2        67 110 238        #436EEE                Orchid2        238 122 233        #EE7AE9
RoyalBlue3        58 95 205        #3A5FCD                Orchid3        205 105 201        #CD69C9
RoyalBlue4        39 64 139        #27408B                Orchid4        139 71 137        #8B4789
Blue1        0 0 255        #0000FF                Plum1        255 187 255        #FFBBFF
Blue2        0 0 238        #0000EE                Plum2        238 174 238        #EEAEEE
Blue3        0 0 205        #0000CD                Plum3        205 150 205        #CD96CD
Blue4        0 0 139        #00008B                Plum4        139 102 139        #8B668B
DodgerBlue1        30 144 255        #1E90FF                MediumOrchid1        224 102 255        #E066FF
DodgerBlue2        28 134 238        #1C86EE                MediumOrchid2        209 95 238        #D15FEE
DodgerBlue3        24 116 205        #1874CD                MediumOrchid3        180 82 205        #B452CD
DodgerBlue4        16 78 139        #104E8B                MediumOrchid4        122 55 139        #7A378B
SteelBlue1        99 184 255        #63B8FF                DarkOrchid1        191 62 255        #BF3EFF
SteelBlue2        92 172 238        #5CACEE                DarkOrchid2        178 58 238        #B23AEE
SteelBlue3        79 148 205        #4F94CD                DarkOrchid3        154 50 205        #9A32CD
SteelBlue4        54 100 139        #36648B                DarkOrchid4        104 34 139        #68228B
DeepSkyBlue1        0 191 255        #00BFFF                Purple1        155 48 255        #9B30FF
DeepSkyBlue2        0 178 238        #00B2EE                Purple2        145 44 238        #912CEE
DeepSkyBlue3        0 154 205        #009ACD                Purple3        125 38 205        #7D26CD
DeepSkyBlue4        0 104 139        #00688B                Purple4        85 26 139        #551A8B
SkyBlue1        135 206 255        #87CEFF                MediumPurple1        171 130 255        #AB82FF
SkyBlue2        126 192 238        #7EC0EE                MediumPurple2        159 121 238        #9F79EE
SkyBlue3        108 166 205        #6CA6CD                MediumPurple3        137 104 205        #8968CD
SkyBlue4        74 112 139        #4A708B                MediumPurple4        93 71 139        #5D478B
LightSkyBlue1        176 226 255        #B0E2FF                Thistle1        255 225 255        #FFE1FF
LightSkyBlue2        164 211 238        #A4D3EE                Thistle2        238 210 238        #EED2EE
LightSkyBlue3        141 182 205        #8DB6CD                Thistle3        205 181 205        #CDB5CD
LightSkyBlue4        96 123 139        #607B8B                Thistle4        139 123 139        #8B7B8B
SlateGray1        198 226 255        #C6E2FF                grey11        28 28 28        #1C1C1C
SlateGray2        185 211 238        #B9D3EE                grey21        54 54 54        #363636
SlateGray3        159 182 205        #9FB6CD                grey31        79 79 79        #4F4F4F
SlateGray4        108 123 139        #6C7B8B                grey41        105 105 105        #696969
LightSteelBlue1        202 225 255        #CAE1FF                grey51        130 130 130        #828282
LightSteelBlue2        188 210 238        #BCD2EE                grey61        156 156 156        #9C9C9C
LightSteelBlue3        162 181 205        #A2B5CD                grey71        181 181 181        #B5B5B5
LightSteelBlue4        110 123 139        #6E7B8B                gray81        207 207 207        #CFCFCF
LightBlue1        191 239 255        #BFEFFF                gray91        232 232 232        #E8E8E8
LightBlue2        178 223 238        #B2DFEE                DarkGrey        169 169 169        #A9A9A9
LightBlue3        154 192 205        #9AC0CD                DarkBlue        0 0 139        #00008B
LightBlue4        104 131 139        #68838B                DarkCyan        0 139 139        #008B8B
LightCyan1        224 255 255        #E0FFFF                DarkMagenta        139 0 139        #8B008B
LightCyan2        209 238 238        #D1EEEE                DarkRed        139 0 0        #8B0000
LightCyan3        180 205 205        #B4CDCD       
LightCyan4        122 139 139        #7A8B8B                LightGreen        144 238 144        #90EE90



1<词>,2[句],3/段\,4{节},5(章)。
2016-2-6 23:56
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zzz19760225
超级版主




积分 3673
发帖 2020
注册 2016-2-1
状态 离线
『第 19 楼』:  http://tool.oschina.net/commons?type=6#c_

http://tool.oschina.net/commons?type=6#c_
Java 运算符优先级
运算符        优先级
postfix        expr++ expr--
unary        ++expr --expr +expr -expr ~ !
multiplicative        * / %
additive        + -
shift        << >> >>>
relational        < > <= >= instanceof
equality        == !=
bitwise AND        &
bitwise exclusive OR        ^
bitwise inclusive OR        |
logical AND        &&
logical OR        ||
ternary        ? :
assignment        = += -= *= /= %= &= ^= |= <<= >>= >>>=
C++运算符优先级
Precedence        Operator        Description        Associativity
1        ::        Scope resolution        Left-to-right
2        ++   --        Suffix/postfix increment and decrement
()        Function call
[]        Array subscripting
.        Element selection by reference
−>        Element selection through pointer
3        ++   --        Prefix increment and decrement        Right-to-left
+   −        Unary plus and minus
!   ~        Logical NOT and bitwise NOT
(type)        Type cast
*        Indirection (dereference)
&        Address-of
sizeof        Size-of
new, new[]        Dynamic memory allocation
delete, delete[]        Dynamic memory deallocation
4        .*   ->*        Pointer to member        Left-to-right
5        *   /   %        Multiplication, division, and remainder
6        +   −        Addition and subtraction
7        <<   >>        Bitwise left shift and right shift
8        <   <=        For relational operators < and ≤ respectively
>   >=        For relational operators > and ≥ respectively
9        ==   !=        For relational = and ≠ respectively
10        &        Bitwise AND
11        ^        Bitwise XOR (exclusive or)
12        |        Bitwise OR (inclusive or)
13        &&        Logical AND
14        ||        Logical OR
15        ?:        Ternary conditional        Right-to-Left
16        =        Direct assignment (provided by default for C++ classes)
+=   −=        Assignment by sum and difference
*=   /=   %=        Assignment by product, quotient, and remainder
<<=   >>=        Assignment by bitwise left shift and right shift
&=   ^=   |=        Assignment by bitwise AND, XOR, and OR
17        throw        Throw operator (for exceptions)
18        ,        Comma        Left-to-right
C语言运算符优先级
Precedence        Operator        Description        Associativity
1        ++ --        Suffix/postfix increment and decrement        Left-to-right
()        Function call
[]        Array subscripting
.        Structure and union member access
−>        Structure and union member access through pointer
(type){list}        Compound literal(C99)
2        ++ --        Prefix increment and decrement        Right-to-left
+ −        Unary plus and minus
! ~        Logical NOT and bitwise NOT
(type)        Type cast
*        Indirection (dereference)
&        Address-of
sizeof        Size-of
_Alignof        Alignment requirement(C11)
3        * / %        Multiplication, division, and remainder        Left-to-right
4        + −        Addition and subtraction
5        << >>        Bitwise left shift and right shift
6        < <=        For relational operators < and ≤ respectively
> >=        For relational operators > and ≥ respectively
7        == !=        For relational = and ≠ respectively
8        &        Bitwise AND
9        ^        Bitwise XOR (exclusive or)
10        |        Bitwise OR (inclusive or)
11        &&        Logical AND
12        ||        Logical OR
13        ?:        Ternary conditional        Right-to-Left
14        =        Simple assignment
+= −=        Assignment by sum and difference
*= /= %=        Assignment by product, quotient, and remainder
<<= >>=        Assignment by bitwise left shift and right shift
&= ^= |=        Assignment by bitwise AND, XOR, and OR
15        ,        Comma        Left-to-right
PHP运算符优先级
结合方向        运算符        附加信息
非结合        clone new        clone 和 new
左        [        array()
非结合        ++ --        递增/递减运算符
非结合        ~ - (int) (float) (string) (array) (object) (bool) @        类型
非结合        instanceof        类型
右结合        !        逻辑操作符
左        * / %        算术运算符
左        + - .        算术运算符 和 字符串运算符
左        << >>        位运算符
非结合        < <= > >= <>        比较运算符
非结合        == != === !==        比较运算符
左        &        位运算符 和 引用
左        ^        位运算符
左        |        位运算符
左        &&        逻辑运算符
左        ||        逻辑运算符
左        ? :        三元运算符
右        = += -= *= /= .= %= &= |= ^= <<= >>=        赋值运算符
左        and        逻辑运算符
左        xor        逻辑运算符
左        or        逻辑运算符
左        ,        多处用到
这个表给出Python的运算符优先级(从低到高).

从最低的优先级(最松散地结合)到最高的优先级(最紧密地结合)。

这意味着在一个表达式中,Python会首先计算表中较下面的运算符,然后在计算列在表上部的运算符。

Python 运算符优先级
运算符        描述
lambda        Lambda表达式
or        布尔“或”
and        布尔“与”
not x        布尔“非”
in,not in        成员测试
is,is not        同一性测试
<,<=,>,>=,!=,==        比较
|        按位或
^        按位异或
&        按位与
<<,>>        移位
+,-        加法与减法
*,/,%        乘法、除法与取余
+x,-x        正负号
~x        按位翻转
**        指数
x.attribute        属性参考
x[index]        下标
x[index:index]        寻址段
f(arguments...)        函数调用
(experession,...)        绑定或元组显示
[expression,...]        列表显示
{key:datum,...}        字典显示
'expression,...'        字符串转换

[ Last edited by zzz19760225 on 2016-2-7 at 00:05 ]



1<词>,2[句],3/段\,4{节},5(章)。
2016-2-7 00:03
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zzz19760225
超级版主




积分 3673
发帖 2020
注册 2016-2-1
状态 离线
『第 20 楼』:  

deepin 编辑
Deepin,原名Linux Deepin,是一个致力于为全球用户提供美观易用,安全可靠的Linux发行版。于2014年4月更名为Deepin,常被称为“深度 Linux”。Deepin不仅仅对最优秀的开源产品进行集成和配置,还开发了基于 HTML5 技术的全新桌面环境、系统设置中心、以及音乐播放器,视频播放器,软件中心等一系列面向日常使用的应用软件。
Linux Deepin的前身是Hiweed Linux项目,Hiweed Linux项目曾经因为一些原因短暂的暂停开发,在重启Hiweed Linux项目的时候深度社区(Deepin.org)管理员与Hiweed Linux项目项目发起人hiweed(冷罡华)宣布合作,同时宣布Hiweed Linux更名为Linux Deepin,并且成为深度社区(Deepin.org)下的一个子模块,后来不断发展而从深度社区独立出来,成为今天的项目。
Linux Deepin 口号是“免除新手痛苦、节约老手时间”,非常注重易用的体验和美观的设计,努力为用户提供稳定、简约、高效的操作系统,以此达到“让 Linux 更易用”的目标。
中文名 深度 Linux(深度系统) 外文名 Deepin 曾用名 Linux Deepin 起    源 Hiweed Linux 项目 类    别 linux 操作系统
目录
1 发展历史
2 发布历史
3 深度桌面
4 最近版本
发展历史编辑
Deepin 2013
Deepin 2013
Deepin 的历史可以追溯到 2004年,其前身 Hiweed Linux 是中国第一个基于 Debian 的本地化版本。在2008年更名为Linux Deepin ,2014年4月又更名为Deepin。Deepin 是当前中国最活跃的 Linux 发行版本。为了支持 Linux Deepin的长期发展,在2011年成立了武汉深之度科技有限公司,并组建了专职研发团队对linux deepin进行支持。2011年获得商业投资,已经建立起国内唯一拥有员工数十人专注于桌面 Linux 发行版的团队。 Deepin 与搜狗,WPS,傲游等合作伙伴进行了多方位合作,共同打造基于 Linux 系统的生态系统。同时,我们还在努力解决迁移Windows平台软件带来的各种兼容性问题,以便用户平滑的过渡到开放安全的 Linux 平台上来。[1]
对个人用户来说,使用 Deepin 不但完全免除了购买费用,而且不会被流行的各种病毒和木马感染。对于政府和企业用户,由于源代码开放可控,绝无后门隐患,安全性也更有保障,大大降低了维护代价和购买防护软件的费用。
Deepin的发展迅速,获得全球四十多个国家用户的支持,累计下载量数千万次,并成为在distrowatch上排名最高的中国Linux操作系统发行版。
Deepin 每 6 个月发布一个新版本,一年发布两次,约在每年的的 6 月份和 12 月份各发布一次。从11.12 开始,Deepin提供了简体中文、繁体中文、英文单独的ISO光盘镜像,桌面环境采用经过团队精心定制的 GNOME Shell,更加适合多数人的操作习惯。Deepin2013版本以后预计发布周期更改为一年一个版本。[2]
发布历史编辑
版 本        发 布 周 期        备 注
Linux Deepin 9.12        2009 年 12 月 30 日        正 式 版
Linux Deepin10.06        2010 年 07 月 23 日        正 式 版
Linux Deepin10.12        2010 年 12 月 31 日        正 式 版
Linux Deepin11.06        2011 年 07 月 04 日        正 式 版
Linux Deepin11.12        2011 年 12 月 31 日        正 式 版
Linux Deepin11.12.1        2012 年 02 月 29 日        修正版
Linux Deepin12.06        2012 年 07 月 17 日        正 式 版
Linux Deepin12.12        2013 年 06 月 19 日        正 式 版
Linux Deepin12.12.1        2013 年 08 月 07 日        修正版
Linux Deepin2013        2013 年 11 月 28 日        正 式 版
Deepin2014Alpha        2014 年 04 月 15 日        体验版
Deepin 2014 Beta
          2014 年 05 月 15 日        体验版
Deepin 2014 RC        2014 年 06 月 14 日        发布候选版
Deepin 2014        2014 年 07 月 06 日       
正式版
Deepin 2014.1        2014 年 08 月 28 日        正式版
Deepin 2014.2 RC        2014 年 12 月 19 日       
发布候选版
Deepin 2014.2        2014 年 12 月 31 日        正式版
Deepin 2014.3        2015 年 04 月 28 日        正式版
目前,Linux Deepin 团队为广大 Linux 桌面用户精心开发了 深度音乐播放器(deepin music player)、深度截图工具(deepin screenshot tool)、深度软件中心(deepin software center)、深度影音播放器(deepin media player)等,均得到国内、国际社区的极大关注和鼓励、支持。
深度桌面编辑
深度桌面环境是一个技术革新的产物,深度桌面环境完全是由 HTML5技术来搭建的,但是和平常我们了解的浏览器里面的 HTML5 不一样。深度桌面环境通过修改 WebKit 核心代码达到 HTML5 和底层 C 库进行互通,这样界面部分的代码完全由 HTML5、JS、CoffeeScript 来构建,而底层的逻辑则由底层的各种 C 语言库来控制。
通过 HTML5结合底层 C 语言库的方式,我们既能用传统构建网站的方式和标准来编写桌面系统,又能通过底层的 C 语言库解决传统 HTML5 不能调用操作系统API的难题。
相对于传统技术构建的 GNOME和 KDE的优势主要有:
开发桌面环境的界面不再需要额外学习,只要会 HTML和 JS就可以快速编写。
JS在界面技术上更加成熟和标准,编写深度桌面环境会比传统的 GTK/QT 的控件方式更加灵活高效。
WebKit对底层代码非常稳定,利用HTML5构建的深度桌面环境非常稳定,很少会发生崩溃的问题。
HTML5/C的方式让界面代码和后端逻辑代码进行完全分离,任何界面上的设计改动都会非常快,而不用像传统的控件库,代码关联非常死,改动起来效率不高。[3]
最近版本编辑
Linux Deepin2014
Deepin 2014 正式版于2014年7月6日携带全新的深度桌面环境2.0发布。
概述
  Linux Deepin项目现已正式更名为Deepin项目。
  Deepin项目是一个致力于为全球用户提供美观易用,安全可靠的Linux发行版,Deepin团队基于HTML5技术开发了的全新深度桌面环境,以及音乐播放器,视频播放器,软件中心等一系列特色软件。
  近年来,Deepin发展迅速,获得全球四十多个国家和地区用户的支持,累计下载量数千万次,并成为在Distrowatch上排名最高的中国Linux操作系统发行版。
  Deepin 2014 正式版与Deepin 2013 正式版版本相比,进行了如下更新和变化:
  多国语言支持

得益于Deepin社区各国翻译者的努力,Deepin 2014正式提供10种语言,并且所有语言都集成在一个ISO镜像中,方便大家安装使用。
  目前Deepin国际化项目正在翻译的语言有67种(包含相同语言不同语系),欢迎各位爱好者们加入该项目,让Deepin系统支持更多语言。
  深度桌面环境2.0

Deepin 2014携带全新的深度桌面环境2.0,搭配特别设计的深度主题,使Deepin 2014整体风格和外观统一、简洁。
  深度桌面环境2.0较前版新增了用户引导、启动器中文拼音搜索、直观的热区设置等便利功能,初次使用Deepin系统的用户也能得心应手。
  同时,我们对深度桌面环境2.0和系统内部进行了全面优化,开机内存占用仅需500M,并且完善了系统内部消息的提示机制,使Deepin 2014更为轻巧灵敏。
  控制中心

深度桌面环境2.0中的系统设置现已全面升级为控制中心,并且外观改为屏幕右侧弹出面板的方式,让控制中心使用更高效、美观。
  控制中心在全面的提升了显示、网络和个性化等重要模块性能的同时,新增了更多可设置功能,例如系统主题管理和程序启动菜单管理。
  软件与管理
  Deepin 2014新增深度影院、深度翻译和深度启动盘制作工具等全新软件,更新了搜狗输入法等和谷歌浏览器的常用软件,方便大家的日常娱乐和工作使用。

我们在Deepin 2013软件仓库的基础上,新增了大量的第三方软件,打开深度软件中心可直接安装使用,同时系统支持启动器中直接右键卸载程序。现在,在Deepin下的无论是安装还是卸载软件,都不需要繁琐的Root认证,并且全程操作都有严格的控制,不会出现安全问题。

此外,Deepin项目在全球拥有近70个以上的 软件源,深度软件中心检测最佳源功能重新回归,该功能新增物理位置判断,该功能够帮助您快速的选择最佳软件源,以便您能够快速的更新系统和安装软件。
安装

  Deepin 2014已经完美支持BIOS和UEFI启动。

为了降低用户安装门槛,我们特地开发了深度启动盘制作工具(系统镜像自带)和深度安装器,大家使用两个软件即可轻松的安装Deepin系统,详细的安装过程可以查看百科获取。
  注意:
  *Deepin 2014 起去除了DeepinWin(Wubi)安装模式。
  *Deepin 2014 Alpha 以上版本可以直接升级至Deepin 2014正式版,Deepin 2014 Aplha之前的版本,建议以重装系统的方式更新至Deepin2014正式版。
  *请使用NVIDIA显卡的朋友不要安装闭源显卡驱动,否则控制中心会无法启动。


Deepin系统首次在龙芯3号电脑上运行成功
2014-11-28 10:13:56 来源: cnbeta网站
16
摘要:笔者曾介绍过Deepin 将对龙芯进行全面支持,打造最优美龙芯电脑桌面。现在Deepin团队移植工作取得了突破性的成果,Deepin桌面已经在龙芯3A和龙芯3B电脑上成功运行起来了。
以下为龙芯3号电脑上运行Deepin系统的照片,由Deepin提供。

Deepin系统首次在龙芯3号电脑上运行成功

图 1  龙芯3A电脑运行Deepin系统桌面

据介绍,“龙芯”3B处理器采用28纳米工艺制造,拥有11亿个晶体管,在设计的复杂度上与国际主流相近,这也是我国第一个超过10亿的晶体管的产品,其运算性能实现了大幅飞跃,国产龙芯处理器与市场主流产品之间的差距正在大幅缩短。

据了解,Deepin (深度)是一个致力于为全球用户提供美观易用,安全可靠的 Linux 发行版。Deepin 非常注重易用的体验和美观的设计,因此对于大多数用户来说,它易用安装和使用,还能够很好的代替Windows系统进行工作与娱乐。对个人用户来说,使用 Deepin 不但完全免除了购买费用,而且不会被流行的各种病毒和木马感染。对于政府和企业用户,由于源代码开放可控,绝无后门隐患,安全性也更有保障,大大降低了维护代价和购买防护软件的费用。

Deepin系统首次在龙芯3号电脑上运行成功

图 2 龙芯3A电脑运行Deepin系统截图

Deepin系统首次在龙芯3号电脑上运行成功

图3  龙芯3B电脑运行Deepin系统截图

从Deepin提供的截图可以看到运行的是一台龙芯3B 6核心CPU

Deepin系统首次在龙芯3号电脑上运行成功

图4 龙芯3B运行Deepin系统内核信息截图

Deepin 的历史可以追溯到 2004年,其前身 Hiweed Linux 是中国第一个基于Debian 的本地化版本。在2008年更名为Linux Deepin ,2014年4月又更名为Deepin。Deepin 是当前中国最活跃的 Linux 发行版本。为了支持 Linux Deepin的长期发展,在2011年成立了武汉深之度科技有限公司,并组建了专职研发团队对linux deepin进行支持。Deepin 与搜狗,WPS,傲游等合作伙伴进行了多方位合作,共同打造基于 Linux 系统的生态系统。同时,还在努力解决迁移Windows平台软件带来的各种兼容性问题,以便用户平滑的过渡到开放安全的 Linux 平台上来。Deepin的发展迅速,获得全球四十多个国家用户的支持,累计下载量数千万次,并成为在distrowatch上排名最高的中国Linux操作系统发行版。

据Deepin 工程师介绍,由于目前的开发还在马不停蹄的进行中,最近又新增了龙芯3B的开发机,争取尽早完成全部移植工作,移植成功后的Deepin 龙芯版和X86版没有什么区别。这次还放出了龙芯3B电脑Deepin系统上用Iceweasel浏览器访问网站的截图,Iceweasel(冰鼬))网络浏览器,是Mozilla Firefox浏览器的Debian再发布版。

Deepin系统首次在龙芯3号电脑上运行成功

图5 龙芯3B电脑运行Deepin系统并浏览Deepin 网站

091035p8kt9n5nn8qtbbl5.jpg

图6 龙芯3B电脑运行Deepin系统并浏览龙芯网站

Deepin系统首次在龙芯3号电脑上运行成功

图7 龙芯3B电脑运行Deepin系统并浏览网站

Deepin系统首次在龙芯3号电脑上运行成功

图8 龙芯3B电脑运行Deepin系统并浏览门户网站

龙芯俱乐部在最近发布的龙芯3B版“龙芯盒子”迷你电脑,届时也将采用Deepin 系统。龙芯俱乐部组织少量的社区龙芯3B 开发机的申购,具体可邮件咨询loongsonclub@126.com

Deepin系统首次在龙芯3号电脑上运行成功

图9 龙芯3B"龙芯盒子"迷你电脑

此外,由于最早的龙芯电脑采用龙芯2F CPU,而随着龙芯产品全面升级,龙芯2H、龙芯3A、龙芯3B,等新型号CPU逐步替代了龙芯2F的产品。新品与龙芯2F相比,性能更好,集成度更高,核心数更多而且软件兼容的支持做的更好。不过由于2F笔记本的有较大的产量和用户,方便学习交流,并且价格也降到了一个非常适合学习研究的价位,所以依然可以发挥余热。

龙芯俱乐部是多年从事龙芯和开源推广的社区,和龙芯产业化基地的中科梦兰合作,借龙芯产品升级换代的机会,面向社区爱好者提供的龙芯2F梦珑迷你笔记本电脑,有极高的性价比,仅仅199元,是目前最便宜的Linux学习电脑,甚至比早期的龙芯2F芯片还便宜,已经有用户陆续收货,团购网址www.loongsonclub.com

Deepin系统首次在龙芯3号电脑上运行成功


图10 龙芯3B电脑运行Deepin 系统并浏览龙芯俱乐部网站

netease 本文来源:cnbeta网站

[ Last edited by zzz19760225 on 2016-2-8 at 03:06 ]



1<词>,2[句],3/段\,4{节},5(章)。
2016-2-8 02:58
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zzz19760225
超级版主




积分 3673
发帖 2020
注册 2016-2-1
状态 离线
『第 21 楼』:  

中国传统历法
收藏
分享
农历
编辑词条
该词条缺少摘要图,补充相关内容帮助词条更加完善!立刻编辑>>
农历是中国长期采用的一种汉族传统历法,又有夏历、汉历等名称。这种历法安排了二十四节气以指导古代劳动人民农业生产活动,故“文革”时改称农历,沿袭至今实际上农历与阴历是不同的。阴历以朔望的周期来定月,用置闰的办法使年平均长度接近太阳回归年。农历是中国目前与公历并行使用的一种历法,虽然人们习称“阴历”,但其实是阴阳历的一种,并非只按月相周期制定历法的阴历。除了清明节是按照农历二十四节气的“清明”制定的以外,中国其他传统节日是以农历日期制定的,至今汉字文化圈的国家和民族多仍庆祝农历的传统节日,如春节、端午节、中秋节、重阳节等。
中文名        农历
别 称        夏历、汉历、旧历
特 点        以朔望月定月,以闰月调年
流行地区        中国、东亚、东南亚汉字文化圈       
外文名        the traditional Chinese calendar
性 质        阴阳合历
发明者        中国汉人


1历法详情
2演变简史
3关于建正问题
4农历规则计算
常用术语
农历规则
干支纪法
年份的计算
朔日的计算
月份的确定
节气的计算
5农历二十四节气
节气起源
七言绝句
口诀
农历二十四节气释义
6阴阳历法
7中国历代历法
8闰月概览
9月份别称
10农历的优缺点
农历的缺点
农历的优点
比较
11公农历名称对比
1 历法详情 编辑
农历,又称 夏历、 汉历,是中国传统历法之一 。主要历法规则由中国汉族经历多个朝代所制定,其形式一直延续至今。农历属于一种 阴阳历:其年份分为 平年和 闰年。 平年为十二个月;闰年为十二个普通月另加一个闰月,总共十三个月。月份分为大月和小月, 大月三十天, 小月二十九天,其平均历月等于一个 朔望月。一年中哪个月大,哪个月小,年年不同,由计算决定。平年全年354~355天,闰年全年383~384天。由于12个朔望月为一年的天数比 太阳年约差十一天,所以设置 闰月以使平均历年为一个 回归年,那么每年的平均日数就接近365.2422日。置闰规则为以不含二十四节气之中气的月份为闰月。由于1回归年为12.368个朔望月,0.368=368/1000=46/125,即125个回归年的话正好余出46个朔望月,所以在一百二十五年中应设置四十六个闰年。但因为这样设闰太过复杂,经推算,7/19最接近0.368。故产生19年7闰的规律。此外,附加 二十四节气以反映 季节的变化特征,指导农业等事。所以,农历既有阴历又有 阳历的成分。

旧历、老历、阴历也是指农历。但旧历、老历只是相对新历(即公历)而言,并非正当称谓。而 阴历事实上是按月亮的 月相变化来安排的历法,与农历含有阳历性质的事实不符,应该弃用。

农历可以追溯到清朝的 时宪历,因为其历法规则大致相同:

辛亥革命后,国民政府沿用清朝的 时宪历,但加进格列历(即公历)内容,每年颁发的历书称为"某某年历书";公元1927年国民政府迁都南京后,改称国民历(国历)。公元1949年中华人民共和国成立后,历法内容不变,但改用公元纪年,即完全采用格列历,同时并用旧历。

《人民日报》的报头日历从1948年6月15日创刊后长期称用“ 夏历”,后来从“文革”时期的1968年元旦开始改用“农历”,从1980年元旦开始去掉“农历”两字,只标示干支纪年及旧历月日。但近几年来,不少报社、出版社、广播电台、电视台等单位仍然将中国传统历法称为“农历”。“农历”之称是“文革”产物,应予纠正。

使用“夏历”称谓的原因:汉武帝元封七年(公元前104年)夏五月改为太初元年,以立春正月即夏正为岁首;除极短时期外,一直到清朝,约二千年间,都用夏正,因而一般叫做夏历。 另有观点认为“夏历”是 夏朝时使用的历法,是古六历之一,历法规则与农历不完全相同,此名字也不合理。

又有观点认为应使用“汉历”称谓:夏历相传创始于 夏代,完善于汉代,加之主要是汉族人使用,以至于 清朝刚建立时都把此历称为 汉历。详见清康熙御制《汉历大全》。

关于农历的纪年方法:

清朝的时宪历采用帝王 年号纪年法,一帝一年号,如: 乾隆二十七年十二月廿二日。

清朝末年, 刘师培(1884-1919)于1903年8月,署名“无畏”,发表《黄帝纪年论》一文,提出废除以帝王纪年的传统方式,采用 黄帝纪年。提出一个民族必须追溯自己的起源,振奋民族精神首先就是要唤起国民对中国历史的重视, 黄帝被称为人文初祖,是公认的中华民族祖先,因此应以 黄帝纪年。 黄帝纪年是唐代学者 张守节推演出来的,他穷其半生精力研究并注释《史记》,在卅卷的《 史记正义》一书中提出了黄帝纪年。

孙中山领导的中国同盟会等革命派团体仍沿用了 黄帝纪元,不过将黄帝纪年元年从黄帝出生改为 黄帝登基的年份。武昌起义后,湖北军政府率先在公文中采用黄帝纪元,以 宣统三年(1911)为 黄帝纪元4609年,随后各省革命军政府的文告、勋章、钱币都使用黄帝纪元。连在扬州举事的“草莽英雄”孙天生,张贴的布告也是大汉黄帝纪年。

辛亥革命成功后,有代表提出黄帝纪年不利于与国际通行的历法相衔接,遂决定改用 西历( 阳历)。1912年1月,中华民国临时大总统孙中山发布《 改历 改元通电》:“中华民国改用阳历,以 黄帝纪元四千六百九年即辛亥十一月十三日,为 中华民国元年元旦”。黄帝纪元的使用至此为止。 1912年起采用 民国纪年,到1949年新中国成立止(上文有说明),而台湾地区依旧使用。

另外, 清朝被推翻后,皇帝年号被废除,国民政府没有保留 黄帝纪年在夏历上,固夏历只剩下 干支纪年这一纪年法,并沿用至今。但干支纪年同时为 黄历中 干支历的部分,并以 立春为岁首。于是,随着时间的推移,产生了夏历和干支历的混淆现象。一直以来,均有不少专家学者提出要求恢复黄帝纪年的建议。毕竟干支纪年只是60年的周期循环式纪年,而 黄帝纪年是连续递进式的纪年,在此点上优越性明显。我国在采用西方 公元纪年的同时有必要采用自己的带有 中华民族特色的传统纪年方法。

2 演变简史 编辑
中国的历法与 纪年采用 阴阳 干支三合历;上古时期,根据不同的 农业牧业生产情况需要,分别产生过 太阳历、 太阴历和 阴阳历。农历作为 中国传统历法,最早源自何时无从考究,据出土的 甲骨文和古代中国典籍多有记载,现时阴阳合一的 历法规则一般认为源自 殷商时期。 从 黄帝 纪年到 清朝 末期启用 西历 ( 格里历 ),中国历史上一共产生超过102部历法,这些历法对 中国文化与文明产生过重大影响,比如 夏历、商历( 殷历)、 周历、西汉 太初历、隋 皇极历、唐 大衍历等,有的 历法虽然没有正式使用过,但对养生、 医学、思想 学术、 天文、 数学等有所作用,如 西汉末期的 三统历和 隋朝的 皇极历等。

汉朝以前的古代中国 历法以366天为一 岁,用“ 闰月”确定 四时和确定 岁的 终始;已经有 日、 月、 旬和 时的 时间单位,具备了 阴阳历的技术;观察到了金木水火土五大行星和日月的运动 规律,用“闰月”“减差法”来调整 时差;历法实施成为重要大事,主要内容之一是“以闰月定四时成岁”和“正闰余”,即确定闰月位置和如何减去多余出来的天数(不是加上缺少的天数),由此来确定年岁的终结和开始。到了 春秋战国时期,由于 周朝王室衰落,诸侯各行其是,因此出现多轨制历法,亦即各诸侯和各地部落还有自己的地方历法; 秦朝为中国历史上最后一个“以闰月定四时成岁”的历法。

汉朝初期开始 中国历法出现了大转折,全国统一历法, 历法也成为了一门较为独立的 科学技术。 汉武帝责成 邓平、 唐都、 落下闳等人议造《 汉历》,汉武帝元封七年历成。是年五月改年号为太初(即为太初元年),并颁布实施这套《汉历》,后人以此称呼此历为《 太初历》,之后 刘歆作《 三统历》,这两历的重要特点是年岁合一,一年的整数天数是365天,不再是之前历法的366天。以“加差法”替代之前的“减差法”以调整时差,年岁周期起始相当固定,用数学计算就能确定闰月,用不着“考定 星历,建立 五行”,至此, 阴阳五行基本上退出了历法。之后中国历朝历代所颁布的历法,均与汉历( 太初历)大同小异。由此知当下使用的这套历法规则基本沿袭汉代的汉历(太初历),而与汉代以前的夏历等是有较大差异的。

中华民国成立后, 纪年采用西历或 民国纪年并用。 中华人民共和国在 1949年成立时,继续使用 西历,以 公元纪年;但中华民 国历仍以1912年为元年,尚在 台湾、 澎湖、 金门、 马祖等地区使用。

3 关于建正问题 编辑
《史记·历书》有“ 夏正”、" 殷正”、" 周正"之分,这就是战国、秦、汉时代盛行的 三正 论。 建正意为阴阳历以哪个月建作为其一年中的第一月份的起始位置。 月建,是指以十二支纪月(到北宋时基本形成完整的 干支历)。 春秋吋期,人们把日南至(即 冬至)的一个月,叫做子月,在子月之后,顺次为丑月、寅月、……,在子月之前,逆次为亥月、戌月、……。 于是,夏代的 岁首是 寅月,商代的岁首是丑月,周代的岁首是 子月。 秦代相信有 三正论,以夏、商、周三代的三正交替是事实,还杷它引伸起来,改以十月为年始。但有人认为三正交替不是历史事实。 到了汉代,武帝 元封七年改用 太初历,以 建寅之月为 岁首。此后两千多年一般都是用 夏正。建正在 阴阳历上的用法是这样的:当把农历的正月置于寅时,往后的月份依次排列,二月便大概和卯对应,三月大概和辰对应,其余类推。

一般所谓 月建是指 十二支而言,如 建子、 建丑、 建寅等等。有人认为月建是指(农历)月的大小而言,所以有 大建和 小建的谬称。 从而又把“正月建寅”等,错误地解读为农历正月等同于“寅”或干支历的寅月。事实上,月建是等分的。按一年365.25日算,共历30.4375日,而1个 朔望月只有29.530589日。这一辰就差了几乎1天。这十二辰合起来差了将近11天。 那相差出来的天数又怎么办?这就是阴阳历需要设置闰月的原因了。

4 农历规则计算 编辑
日月年的定义和 周朝的制度是分不开的,因此夏历受到了当时周朝制度的影响。下面我们进行逐一的介绍(我们这里的时间、 月相计算以东经120度(中国 南京紫金山天文台)为准)。

常用术语
黄经:是在黄道坐标系统中用来确定天体在天球上位置的 坐标值、共分成360度、在这个系统天球被黄道平面分割为南北两个半球,太阳移到黄经0度为春分、移到黄经90度为夏至、移到180度为秋分、移到270度时为冬至。

朔日:月球移到地球和太阳中间时的那一天叫朔日。

平朔:用 朔望月的平均长度计算、没考虑日月运行的不均等性;缺点:“含有真正的“ 朔”的当天有时可能会出现在前一月的最后一日(“ 晦日”、廿九日或卅日),有时会出现在初二”。

定朔:计算考虑了日月运行的不均等性,将含有真正“朔”的当天作为每月的开始。

平气:计算不考虑太阳在 黄道上运动快慢不匀,将一 周年 时间( 回归年)24等分划分出 二十四节气,两个节气之间的平均天数为15.22天。

定气:计算考虑太阳在黄道上运动快慢不匀,将定气两个节气之间的天数不一样、短的只有14天、长的达16天。

冬至日:冬至交接时间所在的那一天就叫冬至日。冬至日必须在子月:冬至日当天或冬至日前的那个朔日定为子月初一“起点”(注意:起点和算命不同)。

建正:年首月份,农历的建正就是“夏正”:夏历正月 建寅[子月为十一月];

殷正:殷历正月建丑[子月为十二月]、 鲁历同殷历;

周正:周历(周朝历)正月建子[子月为正月];

秦正:秦历《颛顼历》正月建亥[亥月为正月]。

置闰:农历1个月就是1个朔望月、月的平均天数≈29.53059天,农历一年12个月≈354.367天;但是1回归年≈365.2422天,这样农历一年比回归年少≈10.866天,农历≈2.71771年就比回归年少1个月,如不调整过不了几十年就会出现冬、夏倒置。为了让农历年平均天数等于回归年农历≈2.71771年必须设一个闰月。置闰规则请看《历代农历编历规则》。

节气:一年分二十四个节气, 清朝《时宪历》(公元1645年)以前用平气计算,清朝《时宪历》(公元1645年)以后用定气计算。

历法:可分为阳历、阴历、 阴阳历三种:

阳历( 太阳历):以太阳周年视运动周期(即 回归年,等于365.2422日)为一年,一年划分成12个月,它与月亮运动毫无关系。根据阳历日期,可知寒来暑往的四季变化、合理指导农业等事。

阴历( 太阴历):以月亮的圆缺周期(即 朔望月,等于29.5306日)为一个月,积12个月为一年。它完全不考虑太阳的周年视运动规律,因而阴历的日期不能显示四季冷暖。这种历法实用价值太小,现除 伊斯兰教外,已弃置不用了。

阴阳历:我国的农历属于此类,它取月相的变化周期即 朔望月为月的长度,参考太阳回归年为年的长度,通过设置闰月以使平均历年与回归年相适应。根据农历日期,既可知道 潮汐涨落,又可大概掌握四季更替。

历书:记载 历法等相关信息的出版物,如 黄历、 万年历书。而电子历书是科技发展的产物,是新的载体。

农历规则
在古代,日的定义:以地球自转一周为一日。 其中以太阳离地平线最远的一个时辰为子时,相当于北京时间23:00~1:00,但是农历中一天始于子正(00:00),而非子初(23:00)。

月策与置末规则: 朔日为每月起点(初一日);朔日(月初一日)到下个朔日(下月初一日)有多少天、这月就有多少天。有30天为大月、有29天为小月;唐朝(公元619年)以前用的是平朔、唐朝(公元619年)以后用的是定朔。

年策与 置闰规则: 以冬至日必须在子月(寅正十一月),上个冬至月(子月农历寅正11月)到下个冬至月(子月\农历寅正11月)有12个月就不置闰,上个冬至月(子月、农历寅正11月)到下个冬至月(子月、农历寅正11月)如有13个月就要置闰,以上个冬至月(子月农历寅正11月)后的第一个没 中气的月份设为 闰月,在几月后面就称闰几月。 例如:2032年农历冬至月到2033年农历冬至月之间有12个月,就不置闰。2033年农历冬至月到2034年农历冬至月有13个月就必须置闰,在2033年冬至月(11月)后的第一个无中气之月就是2033年冬至月后的第1个月,就定为闰月。它正好在冬至月十一月后,所以就叫闰十一月月(闰 冬月)。

干支纪法
1.干支纪年

如甲子为第一年,乙丑为第二年,丙寅为第三年……六十年为一周。一周完了,再由甲子年起,周而始,循环下去。

干支纪年萌芽于汉初,汉章帝元和二年(公元85年),朝廷下令在全国推行干支纪年。从此干支纪年和帝王年号纪年一起使用于中国传统历的纪年。

公历纪元号与干支纪年,例如1929年是己巳年,1930年是庚午年……到1989年又是己巳年。我们在日历上看到的己巳年、庚午年,就是按干支纪年这种方法排列下来的。阳历年份除以60的余数减3便得该年农历干支序号数,再查上面的干支便是干支年纪。如果序号数小于、等于零则于支序号数加60。例如,求1991年干支;1991÷60=33余11,年干支序号数=11-3=8。查干支表知该年为辛未年。又如求1983年干支:1983÷60=33余3,干支序号=3-3=0,加上60,查干支表知该年为癸亥年。

2.干支纪月

起于先秦的十二辰纪月,因此须先确定地支:以冬至所在月份为子月,以此类推。遇到闰月则采用上个月份的地支。确定地支后,下来确定天干:若遇甲或己的年份,正月是丙寅,二月是 丁卯,三月是戊辰,类推;遇上乙或庚之年,正月为戊寅;丙或辛之年正月为庚寅,丁或壬之年正为为壬寅,戊或癸之年正月为甲寅。正月之干支知道了,其余月可按六十甲子的序推知。中国民间对干支纪月起始日的确定存在分歧,共有两种观念。一种是以朔日(即数字纪月每月的初一日)作为起点,遇闰月则与上月用同一干支纪月,历代官方也采用这种纪月法。另一种是以二十四节气中的单数节气(即“非中气”)作为每月的起点,此法多为星相术士采用的。以西元2001年(辛巳年)为例,公历2月4日立春,3月5日惊蛰;1月24日是正月初一,2月23日是二月初一。按第一种观念,则庚寅月从西元2001年1月24日开始,辛卯月从西元2001年2月23日开始。按第二种观念,则庚寅月从西元2001年2月4日开始,辛卯月从西元2001年3月5日开始。干支纪月,在日历中一般较少使用,而以数字和专用字纪月为主。

3.干支纪日

甲子第一日,乙丑为第二日,丙寅为第三日……60日为一周。一周完了再由甲子日起,周而复始,循环下去。例如汉历二二一八[壬辰]年(西历2012年)正月初一是癸未日,初二是甲申日……到三月初一正好是60天,因此三月初二又是癸未日,初三又为甲申日。汉历中,干支纪日一直未中断未乱记,是中国纪日史也是世界纪日史中最长的一种纪日历史。 有明确记载的日期,就可达2700多年。

4.干支纪时

一天中时辰的地支也是确定的,所以二十四小时配十二地支,则为由夜间十一点至一点为子时,一点至三点为丑时,其余照推。时的天由该日所对天干推求,其歌戾如下:

甲己还生甲,乙庚丙作初,

丙辛从戊起,丁壬庚子居,

戊癸何方发,壬子是真途。

即若该日是甲或己的,在子时上配上甲为甲子;日是乙或庚的,在子时上配上丙为丙子;丙辛日子时配上戊为戊子;丁任日为庚子;戊癸日为壬子。知道了子时的干支,便可推知其余。

年份的计算
1 由西元年份推算 天干地支:

公历年份数减3,除以 10 的余数是天干,除以12 的余数是地支。

例如:

(2010 - 3) mod 10 = 7,所以天干是“庚”

(2010 - 3) mod 12 = 3,所以地支是“寅”。

2.积日的计算(用于月份的计算):

把当天和1900年1月0日(星期日)的差称为积日。当年的1月1日换算为积日,可以用年份减去1900得到的年数被4整除,所得商数作为 y(D4),余数作为y(M4),y(M4)为零的年份是公历闰年,积日是

D(1) = 1461 * y(D4)-1

y(M4)不为零的年份是公历平年,积日是

D(1) = 1461 * y(D4) + 365 * y(M4)

朔日的计算
从1900年开始的第m个朔日的公式是

M = 1.6 + 29.5306 * m + 0.4 * sin(1 - 0.45058 * m)

这个公式的误差在0.2天左右。

月份的确定
计算前一年冬至的积日F(0),并用F(0)计算冬至所在的 朔月m及其朔日M(0),就可以推算冬至的农历日期,冬至所在的农历月份总是十一月。计算下一个中气F(1)和下一个朔日M(1),如果F(1)<M(1),那么该月就是上一个月的闰月,并把这个中气作为F(2),以后的中气、朔日和农历月份也这样确定。

节气的计算
先给节气进行编号,从近日点开始的第一个节气编为0,编号如下及其相应的月份如下:

0 小寒腊月 6 清明三月 12 小暑六月 18 寒露九月

1.大寒腊月 7 谷雨三月 13 大暑六月 19 霜降九月

2.立春正月 8 立夏四月 14 立秋七月 20 立冬十月

3.雨水正月 9 小满四月 15 处暑七月 21 小雪十月

4.惊蛰二月 10 芒种五月 16 白露八月 22 大雪冬月

5.春分二月 11 夏至五月 17 秋分八月 23 冬至冬月

把当天和1900年1月0日(星期日)的差称为积日,那么第y年(1900年算第0年)第x 个节气的积日是

F = 365.242 * y + 6.2 + 15.22 * x - 1.9 * sin(0.262 * x)

这个公式的误差在0.05天左右。

5 农历二十四节气 编辑
节气起源
农历是阴阳合历,自从西汉太初历开始完整写入农历,是农历的太阳历成分,是农历(阴阳合历)标度太阳运动的成分,农历二十四节气是历算家安照农历的规则,通过实际观测用天文算法计算的,和农历的阴历成分无关的,农历的月份和十二中气是基本对应的,而十二节气可出现在农历的上个月后半月和本月的上半月中。

农历二十四节气是在 四时八节基础上发展起来的。 殷、 周之交已分四时,春秋时代已有分至 启闭八节。到 战国晚期就形成了完整的二十四节气体系( 天文位置已确定)。二十四节气是 中历确定月名月序和设置闰月的凭藉,也是农事活动的主要依据。节气由太阳位置决定,反映太阳的视运动。西汉初年制定的《 太初历》,二十四节气起了非常重要的作用,明确以没有 中气的月份为 闰月,调整了太阳周天与 阴历纪月不相合的矛盾。后来,该历法经由西汉末刘歆改造而成《 三统历》 ,又历经多个朝代的改进,基本形式没变。

太阳从黄经零度起,沿黄经每运行15度所经历的时日称为“一个节气”。每年运行360度,共经历24个节气,每月2个。

其中,每月第一个节气为“节气”,即:

0101立春、0201惊蛰、0301 清明、0401 立夏、0501 芒种、0601 小暑、0701 立秋、0801白露、0901 寒露、1001立冬、1101 大雪和1201小寒等12个节气

每月的第二个节气为“ 中气”,即:

0102雨水、0202春分、0302谷雨、0402小满、0502夏至、0602大暑、0702处暑、0802秋分、0902霜降、1002小雪、1102冬至和1202大寒等12个 中气。

“ 节气”和“ 中气”交替出现,各历时15天左右,现代人们已经把“节气”和“中气”统称为“节气”。

农历二十四节气反映了太阳的周年视运动, 所以节气在现行的公历中日期基本固定,上半年在6日、21日,下半年在8日、23日,前后不差1~2天。

七言绝句
春雨惊春清谷天,夏满芒夏暑相连,

秋处露秋寒霜降,冬雪雪冬小大寒。

口诀
地球绕着太阳转,绕完一圈是一年。

一年分成十二月,二十四节紧相连。

按照公历来推算,每月两气不改变。

上半年是六、廿一,下半年逢八、廿三。

这些就是交 节日,有差不过一两天。

二十四节有先后,下列口诀记心间:

一月小寒接大寒,二月立春雨水连

惊蛰春分在三月,清明谷雨四月天;

五月立夏和小满,六月芒种夏至连

七月大暑和小暑,立秋处暑八月间;

九月白露接秋分,寒露霜降十月全

立冬小雪十一月,大雪冬至迎 新年。

抓紧季节忙生产,种收及时保丰年。

农历二十四节气释义
立春:立是开始的意思,立春就是春季的开始。太阳过黄经三百一十五度春季开始,是为立春。立春是一年中的第一个节气。揭开了春天的序幕,草木开始萌芽,农民开始播种。

雨水:降雨开始,雨量渐增。立春过后,太阳黄经三百三十度的位置,是为雨水。雨水本来是指冰雪融化成水。农民历书说:“门指壬为雨水时,东方解冻,冻雪皆散而为水,化而为雨,故名雨水。”雨水时节,正是万物欣欣向荣,草木萌生的时候。

惊蛰:蛰是藏的意思。惊蛰是指春雷乍动,惊醒了蛰伏在土中冬眠的动物。雨水过后,太阳过黄经三百四十五度的位置,是为惊蛰。约在公历每年的三月五日前后。惊蛰伏中的昆虫。这时节已经进入仲春,桃花红、梨花白,共莺鸣叫、鸟儿高飞。春雷是这节常见的自然现象。

春分:分是平分的意思。春分表示昼夜平分。太阳过黄经零度,是为春分。春分是春天的中间。立春、立夏、立秋、立冬表示四季的开始。春分、芒种、小暑、冬至则处于各个季节的中间。春分这天,太阳光直射赤道,地球上的昼夜时间相等,所以古代春分秋分又称为“日夜分”。

清明:天气晴朗,草木繁茂。 清明节4月5号(扫墓)太阳过黄经十五度的位置时即为清明,约为公历每年的四月五日前后。清明含有天气明朗、空清新明洁,逐渐转暖、草木繁茂之意。清明这天,民间有踏青、寒食、扫墓等习俗。常言道“清明断雪,谷雨断霜”。

谷雨:雨生百谷。雨量充足而及时,谷类作物能茁壮成长。太阳过黄经三十度位置,农民布谷后望雨是为谷雨。约为公历上四月二十日前后。是春季的最后一个节气。这时节田中的秧苗初插,作物新种,最需要丰沛的雨水灌溉滋润,俗语说:“雨生百谷”,雨量充足而及时,谷类作物能够茁壮成长。

立夏:夏季的开始。太阳过黄经四十五度位置,夏季开始是为立夏。古谚有云:“立夏小满,雨水相赶”。立夏是多雨的季节。传说古代君王常在这一天到京城外迎接夏天。

小满:麦类等夏熟作物籽粒开始饱满。小满太阳过黄经六十度位置是为小满,约为公历每年五月二十一日前后。“小满”正当是农历四月中下旬,这时候田里的稻谷和麦子等农作物,渐渐结穗,看来丰实饱满的样子,就等待成熟。庄稼人眼见辛勤与努力,即将有了丰收,于是把这个节气形容成小满。

芒种:麦类等有芒作物成熟。太阳经过黄经七十五度位置即为芒种,约为公历每年的六月五日前后。这一节气,已经进入典型的夏季,天气相当炎热,麦类等芒作物成熟,大部分地区中稻进入返青阶段,秧苗嫩绿,一派生机。芒种接近端午节。

夏至:炎热的夏天来临。至有极的意思,这是一年当中北半球白天最长的一天。太阳过黄经九十度位置,是为夏至。夏至是太阳直射北回归线,北半球一年中白昼最长的一天。夏至过后,地面受热强烈,空气对流旺盛,午后至傍晚常易形成雷阵雨。

小暑:暑是炎热的意思。小暑就是气候开始炎热。太阳过黄经一百零五度位置是为小暑。小暑已是盛夏,颇感炎热,但还未到最热的时候。

大暑:一年中最热的时候。太阳过黄经一百二十度的位置是为大暑,大暑是一年最热的节气。

立秋: 秋季的开始。太阳过黄经一百三十五度,秋季开始即为立秋。立秋是节气迈入秋凉的先声,因为大暑过后夏去秋来,时序到了立秋,表示酷热难熬的夏天即将过去,凉爽舒适的秋天就要来临了。

处暑:处是终止、躲藏的意思。处暑是表示炎热的暑天结束。太阳过黄经一百五十度位置暑气渐消是为处暑,秋季已到,夏天的暑气将要慢慢消退了。但有时也会热得如炎夏,即所谓的“秋老虎”,大概是夏季的回光返照,因此炎热程度不亚于盛暑,因此称为处暑。

白露:天气转凉,露凝而白。太阳过黄经一百六十五度的位置是为白露。约为公历的每年九月七日前后。此时气温开始下降,天气转凉,早晨草木上有了露水。

秋分:昼夜平分。太阳过黄经一百八十度,太阳过赤道位置是为秋分。秋分是象征季节变化的节气。秋分这天,太阳位于黄经一百八十度,阳光几乎直射赤道,昼夜几乎等长。这时进入了凉爽的秋季,所谓的“一场秋雨一场寒”。

寒露:露水已寒,将要结冰。太阳过黄经一百九十五度,夜寒水气渐凝结成霜是为寒露。约为公历的每年十月八日前后。民谚常说:“寒露麦,霜降豆”。

霜降:天气渐冷,开始有霜。太阳过黄经二百一十度位置是为霜降。霜降是秋季的最后一个节气。一般在公历每年的十月二十三日前后。

立冬:冬季的开始。太阳过黄经二百二十五度,时序开始进入冬天,所以叫立冬。古谚:“立冬之日,水始冰,地始冻”。

小雪:开始下雪。太阳过黄经二百四十度位置,气候寒冷逐渐降雪为小雪。约为公历每年的十一月二十二日的前后。

大雪:降雪量增多,地面可能积雪。在每年的12月7日或8日,其时视太阳到达黄经255度。《月令七十二候集解》说:“至此而雪盛也。”大雪的意思是天气更冷,降雪的可能性比小雪时更大了,并不指降雪量一定很大。

冬至:寒冷的冬天来临。至有极的意思,这是一年当中北半球白天最短的一天。太阳经黄经二百七十度为冬至。冬至日,刚好是太阳照射在南回归线上,所以北半球的日间最短,夜间最长。冬至过了之后,太阳照射的光线又向北回转,渐渐接近北半球的地面,日间就渐渐加长,相对的夜间渐短。

小寒:气候开始寒冷。太阳过黄经二百八十五度的位置是为小寒。冬至过后,天气日趋寒冷。小寒时节虽冷但还不算是最冷,所以就称为“小寒”。

大寒:一年中最冷的时候。太阳过黄经三百度气候严寒是为大寒。时序已到了隆冬,天气变得非常寒冷,是一年中最冷的时段,所以这个节气为“大寒”。

6 阴阳历法 编辑
农历即 夏历。农业上使用的 历书,有指导农业生产的意义。但事实上农 历月日与季节变化相差明显,指导农时的效果并不好,我国古代真正指导农时的是“ 二十四气”,它实际是一种特殊的“ 阳历”。

农历的历月长度是以 朔望月为准的,大月30天,小月29天,大月和小 月相互弥补,使历月的平均长度接近朔望月。

农历固定地把朔的时刻所在日子作为月的第一天--初一日。所谓“朔”,从 天文学上讲,它有一个确定的时刻,也就是月亮黄经和 太阳黄经相同的那一瞬间。(太阳和 月亮 黄经的计算十分繁琐和复杂,这里就不予介绍了)

至于定农历 日历中月份名称的根据,则是由“ 中气”来决定的。即以含“ 雨水”的月份为一月;以含“ 春分”的月份为二月;以含“ 谷雨”的月份为三月;以含“ 小满”的月份为四月;以含“ 夏至”的月份为五月;以含“ 大暑”的月份为六月;以含“ 处暑”的月份为七月;以含“ 秋分”的月份为八月;以含“ 霜降”的月份为九月;以含“ 小雪”的月份为十月;以含“ 冬至”的月份为十一月;以含“ 大寒”的月份为十二月。(没有包含中气的月份作为上月的闰月)

农历的历年长度是以回归年为准的,但一个回归年比12个朔望月的日数多,而比13个朔望月短,古代天文学家在编制农历时,为使一个月中任何一天都含有月相的意义,即初一是无月的夜晚,十五左右都是圆月,就以朔望月为主,同时兼顾季节时令,采用十九年七闰的方法:在农历十九年中,有十二个平年,每一平年十二个月;有七个 闰年,每一闰年十三个月。

为什么采取“十九年七闰”的方法呢?一个朔望月平均是29.5306日,一个回归年有12.368个朔望月,0.368小数部分的渐进分数是1/2 、1/3 、3/8 、4/11 、7/19 、46/125,即每二年加一个闰月,或每三年加一个闰月,或每八年加三个闰月……经过推算,十九年加七个闰月比较合适。因为十九个回归年=6939.6018日,而十九个农历年(加七个闰月后)共有235个朔望月,等于6939.6910日,这样二者就差不多了。

另外,“十九年七闰”只是一个近似说法。事实上,春秋时代天文学家曾经首创十九年七闰的方法; 祖冲之 大明历采用20组19年7闰插入1组11年4闰,计391年144闰,使农历的平均历年更接近回归年;此外还有334年123闰、1021年376闰的提法,和回归年的差额更小。但自清代以来,我国即完全采用 天象确定历年、历月,从而使农历的平均历年与回归年完全一致。

七个闰月安置到十九年当中,其安置方法是很有讲究的。农历闰月的设置,自古以来完全是人为的规定,历代对闰月的设置也不尽相同。秦代以前,曾把闰月放在一年的末尾,叫做“十三月”。汉初把闰月放在九月之后,叫做“后九月”。到了汉武帝 太初元年,又把闰月分插在一年中的各月。以后又规定“不包含 中气的月份作为前一个月的闰月”,直到现在仍沿用这个规定。

为什么有的月份会没有中气呢?节气与节气或中气与中气相隔时间平均是30.4368日(即一回归年365.2422日平分12等分),而一个 朔望月平均是29.5306日,所以节气或中气在农历的月份中的日期逐月推迟,到一定时候,中气不在月中,而移到月末,下一个中气移到另一个月的月初,这样中间这个月就没有中气,而只剩一个节气了。

上面讲过,古人在编制农历时,以十二个中气作为十二个月的标志,即雨水是正月的标志,春分是二月的标志,谷雨是三月的标志……把没有中气的月份作为闰月就使得历月名称与中气一一对应起来,从而保持了原有中气的标志。

从十九年七闰来说,在十九个回归年中有228个节气和228个中气,而农历十九年有235个朔望月,显然有七个月没有节气和七个月没有中气,这样把没有中气的月份定为闰月,也就很自然了。

农历月的大小很不规则,有时连续两个、三个、四个大月或连续两个三个小月,历年的长短也不一样,而且差距很大。节气和中气,在农历里的分布日期很不稳定,而且日期变动的范围很大。这样看来,农历似乎显得十分复杂。其实。农历还是有一定循环规律的:由于十九个回归年的日数与十九个农历年的日数差不多相等,就使农历每隔十九年差不多是相同的。每隔十九年,农历相同月份的每月初一日的阳历日一般相同或者相差一、二天。每隔十九年,节气和中气日期大体上是重复的,个别的相差一、两天。相隔十九年闰月的月份重复或者相差一个月。

7 中国历代历法 编辑
古六历

颛顼历- 秦朝、西汉(? - 公元前104年)

太初历( 三统历) - 西汉、新朝、 东汉(公元前104年- 84年)

四分历- 东汉(85年- 220年)、曹魏(220年- 236年)、东吴(222年)、蜀汉(221年- 263年)干象历 - 东吴(223年- 280年)

景初历- 曹魏、西晋、东晋、 刘宋(237年- 444年)、北魏(398年- 451年)

元嘉历 - 刘宋、南齐、南梁(445年- 509年)

大明历 - 南梁、南陈(510年- 589年)

三纪历 - 后秦(384年- 517年)

玄始历 - 北梁(412年- 439年)、北魏(452年- 522年)

正光历 - 北魏(523年- 534年)、东魏(535年- 539年)、西魏(535年- 556年)、北周(556年- 565年)

兴和历- 东魏(540年- 550年)

天保历 - 北齐(551年- 577年)

天和历 - 北周(566年- 578年)

大象历 - 北周(579年- 581年)、隋朝(581年- 583年)

开皇历- 隋(584年- 596年)

大业历 - 隋(597年- 618年)

皇极历

戊寅元历- 唐朝(619年- 664年)

麟德历 - 唐(665年- 728年)

大衍历 - 唐(729年- 761年)

五纪历 - 唐(762年- 783年)

正元历 - 唐(784年- 806年)

观象历 - 唐(807年- 821年)

宣明历 - 唐(822年- 892年)

崇玄历 - 唐(893年- 907年)、 后梁、 后唐、 后晋、 后汉、 后周(908年- 955年)

九执历

符天历

调元历- 后晋(939年- 943年?)、 辽朝(961年? - 993年)

大明历 - 辽(994年- 1125年)

钦天历 - 后周(956年- 960年)、北宋(960年- 963年)

应天历- 北宋(963年- 981年)

干元历 - 北宋(981年- 1001年)

仪天历 - 北宋(1001年- 1023年)

崇天历 - 北宋(1024年- 1065年;1068年- 1075年)

明天历- 北宋(1065年- 1068年)

奉元历 - 北宋(1075年- 1093年)

观天历 - 北宋(1094年- 1102年)

占天历 - 北宋(1103年- 1105年)

纪元历 - 北宋、南宋(1106年- 1135年)

统元历 - 南宋(1136年- 1167年)

干道历 - 南宋(1168年- 1176年)

淳熙历 - 南宋(1177年- 1190年)

会元历 - 南宋(1191年- 1198年)

统天历- 南宋(1199年- 1207年)

开禧历 - 南宋(1208年- 1251年)

淳佑历 - 南宋(1252年)

会天历 - 南宋(1253年- 1270年)

成天历 - 南宋(1271年- 1276年)

大明历 - 金朝(1137年- 1181年)

重修大明历 - 金、元朝(1182年- 1280年)

授时历( 大统历)- 元、 明朝(1281年- 1644年)

时宪历- 清朝(1645年- 1911年)

现行 农历( 民国至今)

8 闰月概览 编辑
在1645年以前,农历使用 平太阳,各月之后出现闰月的概率相等。之后使用 真太阳,各月出现闰月的概率变为不相等。以下是1645年至2644年一千年间各 闰月的统计。

公元1645-2644年间各 闰月出现次数统计表:

闰月        出现次数        闰月        出现次数        闰月        出现次数
闰正月        6        闰二月        23        闰三月        47
闰四月        61        闰五月        74        闰六月        59
闰七月        51        闰八月        26        闰九月        8
闰十月        9        闰十一月        5        闰十二月        0
由上可见,夏季( 夏半年)闰月多,冬季( 冬半年)闰月少,原因就是目前地球 远日点出现在7月初( 夏至到 小暑之间), 近日点出现在1月初( 冬至到 小寒之间),所以夏至小暑前后 地球公转速度较快

另有计算表明,2262年将会再次出现 闰正月;3358年将会首次出现闰十二月(闰十二月初一日对应公元3359年1月21日,这个历月只有“立春”节气)。

以下是2000~7999年共六千年间各闰月数量的统计。

闰月 出现次数

正月 32次

2月 41次

3月 101次

4月 196次

5月 289次

6月367次

7月 351次

8月 316次

9月 231次

10月 150次

冬月 97次

腊月 39次

9 月份别称 编辑
农历的第一个月,按照习惯称为 正月。农历的十一月和十二月分 别称为 冬月和 腊月,但冬月已经很少用了。表示气候寒冷的成语“ 十冬腊月”就是从此得来,字面意思即为十月、十一月和十二月为一年中最寒冷的月份。

农历的一个月的前十天按顺序习惯上称为初日,如农历的一月二日称为正月初二;第十一天至第二十天以及第三十天直接用天数记录,如农历的一月十五日( 元宵节)称为正月十五,农历的十二月三十日( 岁除,当天晚上称为 除夕)称为 腊月三十;第二十一天至第二十九天按顺序习惯上称为 廿日,亦有些 通胜将之说成 念日,如农历的一月二十二日称为正月廿二或正月念二。农历的每个月份都有不同的别称。由于它和农业生产紧密的联系,所以从二月到九月差不多都用植物来表示,下面是农历十二个月的别称:

正月: 端月、 元春、隅月、 始春

二月: 杏月、 花月、 如月、 早春

三月: 桃月、桐月、炳月、 三春、 阳 春、 暮春

四月: 阴月、 梅月、 余月、 清和月

五月: 榴月、 毒月、 蒲月

六月: 荷月、荔月、目月、 伏月

七月: 兰月、 巧月、 瓜月、相月、 霜月、桐月

八月: 桂月、 壮月、 中秋月

九月: 菊月、 玄月

十月: 良月、 阳月、 小阳春

十一月: 冬月、 葭月、 辜月

十二月: 腊月、 涂月、 嘉平月

(注意: 寅月、 卯月、 辰月等十二地支纪月,以及 孟月、 孟春、 仲春、季春、 季夏等(孟是第一的意思,仲是第二,季是第三;农历存在闰月,所以不能用此类称谓。)均为 干支历的专用月称。 )

以花命名的农历各月份的诗意别称: 正月--柳月,银柳插瓶头,又称柳月;二月--杏月,杏花闹枝头,又称杏月;三月--桃月,桃花粉面羞,又称桃月;四月--槐月,槐花挂满枝,又称槐月;五月--榴月,石榴红似火,又称榴月;六月--荷月,荷花满池放,又称荷月;七月--巧月,凤仙节节开,又称巧月;八月--桂月,桂花遍地香,又称桂月;九月--菊月,菊花傲霜雪,又称菊月;十月-- 阳月,芙蓉显小阳,又称阳月;十一月-- 葭月,葭草吐绿头,又称葭月;腊月-- 梅月,梅花吐幽香,又称梅月。此外,农历月份还有其它许许多多的别称。

10 农历的优缺点 编辑
农历的缺点
一、由于农历是定历,历月使用 定朔,所以每年的同一 历月的天数并不确定,不方便统计天数;

二、 历年长度,有353日,354日,355日,383日,384日,385日6种,并且不利于统计年长;

三、 干支循环周期60过短,不方便较长时间的区别,也不方便记忆;

四、 置闰不透明, 闰月不确定。

早在 北宋时,科学家 沈括就已经发现 阴阳历“岁年错乱, 四时失位”,并尝试 改历。他见前朝的旧历法是以十二次的月亮圆缺做为 一年的标准,虽经多次小改革但仍显 气朔交争且岁年错乱,四时失位且又算数过程繁琐。故沈括便决心首先废除先圣王所遗留下来以十二 朔望月为一年的阴历年法之历算法。而改以二十四个节气的定年法。但墨守成规的 司天监庸官皆大力反对,因此不但对于沈括之才能十分嫉恨,且纠合起来进行阻挠又多次借故上告 神宗言沈括的不是。后来此新历法虽实行不久便又被修改掉。但此新历法直至七百多年后的1855年被 太平天国所颁布为 天历使用而延用至今,后又传至英国而英国至今仍用此法以统计农业气候和农事生产的依据。 然而事实上, 十二气历和 天历皆起源于 干支历。

农历的优点
一、农历是定历,它具有 天文年历的特性,能很好地和各种 天象对应,如它的 节气严格对应 太阳高度, 历日较严格地对应 月相, 闰月的不发生频率和发生频率对应地球 近日点和 远日点,其它天象如 日出 日没, 晨昏蒙影, 五星方位, 日月食, 潮汐等,就连 历月也大致对应 太阳高度;

二、农历历月的天数只有29日和30日两种,且由 定朔日规定,人为因素最小,不易随意改动;

三、 岁首有较强的天文学意义,具有阴月阳年的天文学意义;

四、阴阳合历,最体现汉民族 天人合一的传统文化;

五、 干支纪年和 十二生肖纪年循环使用;由于它包含节气十分利于 四季划分,由于它包含月相,所以也十分反映潮汐,日月食等天象和月亮对气候的影响。

比较
一、由于单个公历历年(365或366日)比农历历年(平年354或355日,闰年383或384日)更接近于回归(365.2422日),所以从具体日期反映季节的角度看,则公历比农历更加准确。

二、每年公历的日期比农历的日期都要固定。

三、公历比农历要简单得多。但农历的制定包含“阴”与“阳”,符合中国传统的哲学观。

11 公农历名称对比 编辑
公历标准名称为 格里高利历(Gregorian calendar),以改制此历者 格列高里十三世而名。

现因全球通用,公用之历法,故称“公历”。

传入中国后, 民国开始与传统历法 夏历并用,故民间又出现多种别称以区分二者。对比如下:

公历别称及其原因        农历别称及其原因
公历:公用之历(实用性强)        农历:农用之历(狭隘看法,其实农历科学性更强)
西历:源于西方国家        中历:中国固有历法;汉历:汉族历法
阳历:类型属阳历(太阳历),国内现用最主要的一种阳历,故以阳历称之        阴历:民间误称,农历本属阴阳合历,只是农历日期基本对应月圆月缺,阴历性质显而易见,故称
新历:新采用的历法        旧历:原有的旧历法;老历:类似旧历
国历:民国开始采用,现台湾沿用此名        夏历:一说始于夏朝历法,一说同夏正建寅(岁首寅月) &nbsp;
词条标签:
历法
合作编辑者:
破坏者榴弹枪



1<词>,2[句],3/段\,4{节},5(章)。
2016-2-8 05:20
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zzz19760225
超级版主




积分 3673
发帖 2020
注册 2016-2-1
状态 离线
『第 22 楼』:  WIN7下CMD帮助文件1(1-2)

D:\>help
有关某个命令的详细信息,请键入 HELP 命令名
ASSOC          显示或修改文件扩展名关联。
ATTRIB         显示或更改文件属性。
BREAK          设置或清除扩展式 CTRL+C 检查。
BCDEDIT        设置启动数据库中的属性以控制启动加载。
CACLS          显示或修改文件的访问控制列表(ACL)。
CALL           从另一个批处理程序调用这一个。
CD             显示当前目录的名称或将其更改。
CHCP           显示或设置活动代码页数。
CHDIR          显示当前目录的名称或将其更改。
CHKDSK         检查磁盘并显示状态报告。
CHKNTFS        显示或修改启动时间磁盘检查。
CLS            清除屏幕。
CMD            打开另一个 Windows 命令解释程序窗口。
COLOR          设置默认控制台前景和背景颜色。
COMP           比较两个或两套文件的内容。
COMPACT        显示或更改 NTFS 分区上文件的压缩。
CONVERT        将 FAT 卷转换成 NTFS。您不能转换
               当前驱动器。
COPY           将至少一个文件复制到另一个位置。
DATE           显示或设置日期。
DEL            删除至少一个文件。
DIR            显示一个目录中的文件和子目录。
DISKCOMP       比较两个软盘的内容。
DISKCOPY       将一个软盘的内容复制到另一个软盘。
DISKPART       显示或配置磁盘分区属性。
DOSKEY         编辑命令行、调用 Windows 命令并创建宏。
DRIVERQUERY    显示当前设备驱动程序状态和属性。
ECHO           显示消息,或将命令回显打开或关上。
ENDLOCAL       结束批文件中环境更改的本地化。
ERASE          删除一个或多个文件。
EXIT           退出 CMD.EXE 程序(命令解释程序)。
FC             比较两个文件或两个文件集并显示它们之间的不同。
FIND           在一个或多个文件中搜索一个文本字符串。
FINDSTR        在多个文件中搜索字符串。
FOR            为一套文件中的每个文件运行一个指定的命令。
FORMAT         格式化磁盘,以便跟 Windows 使用。
FSUTIL         显示或配置文件系统的属性。
FTYPE          显示或修改用在文件扩展名关联的文件类型。
GOTO           将 Windows 命令解释程序指向批处理程序
               中某个带标签的行。
GPRESULT       显示机器或用户的组策略信息。
GRAFTABL       启用 Windows 在图形模式显示扩展字符集。
HELP           提供 Windows 命令的帮助信息。
ICACLS         显示、修改、备份或还原文件和
目录的 ACL。
IF             在批处理程序中执行有条件的处理过程。
LABEL          创建、更改或删除磁盘的卷标。
MD             创建一个目录。
MKDIR          创建一个目录。
MKLINK         创建符号链接和硬链接
MODE           配置系统设备。
MORE           逐屏显示输出。
MOVE           将一个或多个文件从一个目录移动到另一个目录。
OPENFILES      显示远程用户为了文件共享而打开的文件。
PATH           为可执行文件显示或设置搜索路径。
PAUSE          停止批处理文件的处理并显示信息。
POPD           还原由 PUSHD 保存的当前目录上一次的值。
PRINT          打印一个文本文件。
PROMPT         改变 Windows 命令提示。
PUSHD          保存当前目录,然后对其进行更改。
RD             删除目录。
RECOVER        从损坏的磁盘中恢复可读取的信息。
REM            记录批处理文件或 CONFIG.SYS 中的注释。
REN            重新命名文件。
RENAME         重新命名文件。
REPLACE        替换文件。
RMDIR          删除目录。
ROBOCOPY       复制文件和目录树的高级实用程序
SET            显示、设置或删除 Windows 环境变量。
SETLOCAL       开始用批文件改变环境的本地化。
SC             显示或配置服务(后台处理)。
SCHTASKS       安排命令和程序在一部计算机上按计划运行。
SHIFT          调整批处理文件中可替换参数的位置。
SHUTDOWN       让机器在本地或远程正确关闭。
SORT           将输入排序。
START          打开单独视窗运行指定程序或命令。
SUBST          将驱动器号与路径关联。
SYSTEMINFO     显示机器的具体的属性和配置。
TASKLIST       显示包括服务的所有当前运行的任务。
TASKKILL       终止正在运行的进程或应用程序。
TIME           显示或设置系统时间。
TITLE          设置 CMD.EXE 会话的窗口标题。
TREE           以图形显示启动器或路径的目录结构。
TYPE           显示文本文件的内容。
VER            显示 Windows 的版本。
VERIFY         告诉 Windows 验证文件是否正确写入磁盘。
VOL            显示磁盘卷标和序列号。
XCOPY          复制文件和目录树。
WMIC           在交互命令外壳里显示 WMI 信息。

有关工具的详细信息,请参阅联机帮助中的命令行参考。
D:\>help assoc
显示或修改文件扩展名关联

ASSOC [.ext[=[fileType]]]

  .ext      指定跟文件类型关联的文件扩展名
  fileType  指定跟文件扩展名关联的文件类型

键入 ASSOC 而不带参数,显示当前文件关联。如果只用文件扩展
名调用 ASSOC,则显示那个文件扩展名的当前文件关联。如果不为
文件类型指定任何参数,命令会删除文件扩展名的关联。

D:\>help attrib
显示或更改文件属性。

ATTRIB [+R | -R] [+A | -A ] [+S | -S] [+H | -H] [+I | -I]
       [drive:][path][filename] [/S [/D] [/L]]
  + 设置属性。
  - 清除属性。
  R 只读文件属性。
  A 存档文件属性。
  S 系统文件属性。
  H 隐藏文件属性。
  I 无内容索引文件属性。
  [drive:][path][filename]
      指定 attrib 要处理的文件。
  /S 处理当前文件夹及其所有子文件夹中的匹配文件。
  /D 也处理文件夹。
  /L 处理符号链接和符号链接目标的属性。


D:\>help break
设置或清除 DOS 系统的扩展 CTRL+C 检测

这个命令是为了与 DOS 系统的兼容而保留的,在 Windows
里不起作用。

如果命令扩展被启用,并且操作平台是 Windows,
BREAK 命令会在被调试程序调试时输入一个硬代码中断点。

D:\>help bcdedit

BCDEDIT - 启动配置数据存储编辑器

Bcdedit.exe 命令行工具用于修改启动配置数据存储。
启动配置数据存储包含启动配置参数并控制操作系统的启动方式。这些参数以前位于
Boot.ini 文件中(在基于 BIOS 的操作系统中)或位于稳定 RAM 项中(在基于可扩展
固件接口的操作系统中)。可以使用 Bcdedit.exe 在启动配置数据存储中添加、删除、
编辑和附加项。

有关命令和选项的详细信息,请键入 bcdedit.exe /? <command>。
例如,若要显示有关 /createstore 命令的详细信息,请键入:

     bcdedit.exe /? /createstore

有关本帮助文件中按字母顺序排列的主题列表,请运行 "bcdedit /? TOPICS"。

对存储执行的命令
================================
/createstore    新建空的启动配置数据存储。
/export         将系统存储的内容导出到文件。以后可以使用该文件还原系统
                存储的状态。
/import         使用 /export 命令创建的备份文件来还原系统存储的状态。

/sysstore       设置系统存储设备(仅影响 EFI 系统,在重新启动后不再有效,
                且仅用于系统存储设备不确定的情况下)。

对存储中的项执行的命令
===========================================
/copy           复制存储中的项。
/create         在存储中新建项。
/delete         删除存储中的项。
/mirror         创建存储中项的镜像。

运行 bcdedit /? ID 可获得有关这些命令使用的标识符的信息。

对项选项执行的命令
======================================
/deletevalue    删除存储中的项选项。
/set            设置存储中的项选项值。

运行 bcdedit /? TYPES 可获得这些命令使用的数据类型的列表。
运行 bcdedit /? FORMATS 可获得有效数据格式的列表。

控制输出的命令
============================
/enum           列出存储中的项。
/v              命令行选项,完整显示项标识符,而不是使用已知标识符的名称。

                单独使用命令 /v 可完整显示活动类型的项标识符。

单独运行 "bcdedit" 等同于运行 "bcdedit /enum ACTIVE"。

控制启动管理器的命令
======================================
/bootsequence   为启动管理器设置一次性启动序列。
/default        设置启动管理器将使用的默认项。
/displayorder   设置启动管理器显示多重引导菜单的顺序。
/timeout        设置启动管理器的超时值。
/toolsdisplayorder  设置启动管理器显示工具菜单的顺序。

控制启动应用程序紧急管理服务的命令
==========================================================================
/bootems        启用或禁用启动应用程序的紧急管理服务。
/ems            启用或禁用操作系统项的紧急管理服务。
/emssettings    设置全局紧急管理服务参数。

控制调试的命令
==============================
/bootdebug      启用或禁用启动应用程序的启动调试。
/dbgsettings    设置全局调试程序参数。
/debug          启用或禁用操作系统项的内核调试。
/hypervisorsettings  设置虚拟机监控程序的参数。


D:\>help cacls

注意: 不推荐使用 Cacls,请使用 Icacls。

显示或者修改文件的访问控制列表(ACL)

CACLS filename [/T] [/M] [/L] [/S[:SDDL]] [/E] [/C] [/G user:perm]
        [/R user [...]] [/P user:perm [...]] [/D user [...]]
    filename      显示 ACL。
    /T            更改当前目录及其所有子目录中
                  指定文件的 ACL。
    /L            对照目标处理符号链接本身
    /M            更改装载到目录的卷的 ACL
    /S            显示 DACL 的 SDDL 字符串。
    /S:SDDL       使用在 SDDL 字符串中指定的 ACL 替换 ACL。
                  (/E、/G、/R、/P 或 /D 无效)。
    /E            编辑 ACL 而不替换。
    /C            在出现拒绝访问错误时继续。
    /G user:perm  赋予指定用户访问权限。
                  Perm 可以是: R  读取
                               W  写入
                               C  更改(写入)
                               F  完全控制
    /R user       撤销指定用户的访问权限(仅在与 /E 一起使用时合法)。
    /P user:perm  替换指定用户的访问权限。
                  Perm 可以是: N  无
                               R  读取
                               W  写入
                               C  更改(写入)
                               F  完全控制
    /D user       拒绝指定用户的访问。
在命令中可以使用通配符指定多个文件。
也可以在命令中指定多个用户。

缩写:
    CI - 容器继承。
         ACE 会由目录继承。
    OI - 对象继承。
         ACE 会由文件继承。
    IO - 只继承。
         ACE 不适用于当前文件/目录。
    ID - 已继承。
         ACE 从父目录的 ACL 继承。

D:\>help call
从批处理程序调用另一个批处理程序。

CALL [drive:][path]filename [batch-parameters]

  batch-parameters   指定批处理程序所需的命令行信息。

如果命令扩展被启用,CALL 会如下改变:

CALL 命令现在将卷标当作 CALL 的目标接受。语法是:

    CALL:label arguments

一个新的批文件上下文由指定的参数所创建,控制在卷标被指定
后传递到语句。您必须通过达到批脚本文件末两次来 "exit" 两次。
第一次读到文件末时,控制会回到 CALL 语句的紧后面。第二次
会退出批脚本。键入 GOTO /?,参看 GOTO :EOF 扩展的描述,
此描述允许您从一个批脚本返回。

另外,批脚本文本参数参照(%0、%1、等等)已如下改变:


     批脚本里的 %* 指出所有的参数(如 %1 %2 %3 %4 %5 ...)

     批参数(%n)的替代已被增强。您可以使用以下语法:

         %~1         - 删除引号("),扩展 %1
         %~f1        - 将 %1 扩展到一个完全合格的路径名
         %~d1        - 仅将 %1 扩展到一个驱动器号
         %~p1        - 仅将 %1 扩展到一个路径
         %~n1        - 仅将 %1 扩展到一个文件名
         %~x1        - 仅将 %1 扩展到一个文件扩展名
         %~s1        - 扩展的路径只含有短名
         %~a1        - 将 %1 扩展到文件属性
         %~t1        - 将 %1 扩展到文件的日期/时间
         %~z1        - 将 %1 扩展到文件的大小
         %~$PATH:1   - 查找列在 PATH 环境变量的目录,并将 %1
                       扩展到找到的第一个完全合格的名称。如果
                       环境变量名未被定义,或者没有找到文件,
                       此修改符会扩展到空字符串

    可以组合修改符来取得多重结果:

        %~dp1       - 只将 %1 扩展到驱动器号和路径
        %~nx1       - 只将 %1 扩展到文件名和扩展名
        %~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,
                      并扩展到找到的第一个文件的驱动器号和路径。
        %~ftza1     - 将 %1 扩展到类似 DIR 的输出行。

    在上面的例子中,%1 和 PATH 可以被其他有效数值替换。
    %~ 语法被一个有效参数号码终止。%~ 修定符不能跟 %*
    使用

D:\> help cd
显示当前目录名或改变当前目录。

CHDIR [/D] [drive:][path]
CHDIR [..]
CD [/D] [drive:][path]
CD [..]

  ..   指定要改成父目录。

键入 CD drive: 显示指定驱动器中的当前目录。
不带参数只键入 CD,则显示当前驱动器和目录。

使用 /D 开关,除了改变驱动器的当前目录之外,
还可改变当前驱动器。

如果命令扩展被启用,CHDIR 会如下改变:

当前的目录字符串会被转换成使用磁盘名上的大小写。所以,
如果磁盘上的大小写如此,CD C:\TEMP 会将当前目录设为
C:\Temp。

CHDIR 命令不把空格当作分隔符,因此有可能将目录名改为一个
带有空格但不带有引号的子目录名。例如:

     cd \winnt\profiles\username\programs\start menu

与下列相同:

     cd "\winnt\profiles\username\programs\start menu"

在扩展停用的情况下,您必须键入以上命令。


D:\>help chcp
显示或设置活动代码页编号。

CHCP [nnn]

  nnn   指定代码页编号。

不带参数键入 CHCP 以显示活动代码页编号。

D:\>help chdir
显示当前目录名或改变当前目录。

CHDIR [/D] [drive:][path]
CHDIR [..]
CD [/D] [drive:][path]
CD [..]

  ..   指定要改成父目录。

键入 CD drive: 显示指定驱动器中的当前目录。
不带参数只键入 CD,则显示当前驱动器和目录。

使用 /D 开关,除了改变驱动器的当前目录之外,
还可改变当前驱动器。

如果命令扩展被启用,CHDIR 会如下改变:

当前的目录字符串会被转换成使用磁盘名上的大小写。所以,
如果磁盘上的大小写如此,CD C:\TEMP 会将当前目录设为
C:\Temp。

CHDIR 命令不把空格当作分隔符,因此有可能将目录名改为一个
带有空格但不带有引号的子目录名。例如:

     cd \winnt\profiles\username\programs\start menu

与下列相同:

     cd "\winnt\profiles\username\programs\start menu"

在扩展停用的情况下,您必须键入以上命令。

D:\>start

D:\>help chkdsk
检查磁盘并显示状态报告。


CHKDSK [volume[[path]filename]]] [/F] [/V] [/R] [/X] [/I] [/C] [/L[:size]] [/B]


  volume         指定驱动器号(后面跟一个冒号)、
装入点或卷名。
  filename        仅用于 FAT/FAT32: 指定要检查是否有碎片的文件。
  /F              修复磁盘上的错误。
  /V              在 FAT/FAT32 上: 显示磁盘上每个文件的
完整路径和名称。
                  在 NTFS 上: 如果有清除消息,则显示。
  /R              查找损坏的扇区并恢复可读信息
                  (隐含 /F)。
  /L:size         仅用于 NTFS:  将日志文件大小更改为指定的 KB 数。如果未
                  指定大小,则显示当前
                  大小。
  /X              如果必要,则先强制卸除卷。
                  该卷的所有打开句柄都会无效
                  (隐含 /F)。
  /I              仅用于 NTFS: 对索引项进行强度较小的检查。
  /C              仅用于 NTFS: 跳过文件夹结构的
                  循环检查。
  /B              仅用于 NTFS: 重新评估该卷上的坏簇
                  (隐含 /R)

/I 或 /C 开关通过跳过对该卷的某些检查,
可减少运行 Chkdsk 所需的时间。

D:\>help chkntfs
启动时显示或修改磁盘检查。

CHKNTFS volume [...]
CHKNTFS /D
CHKNTFS /T[:time]
CHKNTFS /X volume [...]
CHKNTFS /C volume [...]

  volume         指定驱动器号(后面跟一个冒号)、装入点或卷名。
  /D             将计算机还原为默认行为;
                 启动时检查所有驱动器,并对有问题的驱动器运行 chkdsk。
  /T:time        将 AUTOCHK 初始递减计数时间
                 更改为指定的时间,单位为秒。
                 如果没有指定时间,则显示当前设置。
  /X             将驱动器排除在启动时检查范围之外。被排除的驱动器在命令调用之间
不会
                 累计。
  /C             安排驱动器在启动时检查;
                 如果驱动器有问题,则运行 chkdsk。

如果未指定开关,CHKNTFS 将显示指定的驱动器是否有问题
或者是否计划在下一次重新启动时执行检查。

D:\>help cls
清除屏幕。

CLS

D:\>help cmd
启动 Windows 命令解释器的一个新实例

CMD [/A | /U] [/Q] [/D] [/E:ON | /E:OFF] [/F:ON | /F:OFF] [/V:ON | /V:OFF]
    [[/S] [/C | /K] string]

/C      执行字符串指定的命令然后终止
/K      执行字符串指定的命令但保留
/S      修改 /C 或 /K 之后的字符串处理(见下)
/Q      关闭回显
/D      禁止从注册表执行 AutoRun 命令(见下)
/A      使向管道或文件的内部命令输出成为 ANSI
/U      使向管道或文件的内部命令输出成为
        Unicode
/T:fg   设置前台/背景颜色(详细信息见 COLOR /?)
/E:ON   启用命令扩展(见下)
/E:OFF  禁用命令扩展(见下)
/F:ON   启用文件和目录名完成字符(见下)
/F:OFF  禁用文件和目录名完成字符(见下)
/V:ON   使用 ! 作为分隔符启用延迟的环境变量
        扩展。例如,/V:ON 会允许 !var! 在执行时
        扩展变量 var。var 语法会在输入时
        扩展变量,这与在一个 FOR
        循环内不同。
/V:OFF  禁用延迟的环境扩展。

注意,如果字符串加有引号,可以接受用命令分隔符 "&&"
分隔多个命令。另外,由于兼容性
原因,/X 与 /E:ON 相同,/Y 与 /E:OFF 相同,且 /R 与
/C 相同。任何其他开关都将被忽略。

如果指定了 /C 或 /K,则会将该开关之后的
命令行的剩余部分作为一个命令行处理,其中,会使用下列逻辑
处理引号(")字符:

    1.  如果符合下列所有条件,则会保留
        命令行上的引号字符:

        - 不带 /S 开关
        - 正好两个引号字符
        - 在两个引号字符之间无任何特殊字符,
          特殊字符指下列字符: &<>()@^|
        - 在两个引号字符之间至少有
          一个空格字符
        - 在两个引号字符之间的字符串是某个
          可执行文件的名称。

    2.  否则,老办法是看第一个字符
        是否是引号字符,如果是,则去掉首字符并
        删除命令行上最后一个引号,保留
        最后一个引号之后的所有文本。

如果 /D 未在命令行上被指定,当 CMD.EXE 开始时,它会寻找
以下 REG_SZ/REG_EXPAND_SZ 注册表变量。如果其中一个或
两个都存在,这两个变量会先被执行。

    HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\AutoRun

        和/或

    HKEY_CURRENT_USER\Software\Microsoft\Command Processor\AutoRun

命令扩展是按默认值启用的。您也可以使用 /E:OFF ,为某一
特定调用而停用扩展。您
可以在机器上和/或用户登录会话上
启用或停用 CMD.EXE 所有调用的扩展,这要通过设置使用
REGEDIT.EXE 的注册表中的一个或两个 REG_DWORD 值:

    HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\EnableExtensions

        和/或

    HKEY_CURRENT_USER\Software\Microsoft\Command Processor\EnableExtensions

到 0x1 或 0x0。用户特定设置
比机器设置有优先权。命令行
开关比注册表设置有优先权。

在批处理文件中,SETLOCAL ENABLEEXTENSIONS 或 DISABLEEXTENSIONS 参数
比 /E:ON 或 /E:OFF 开关有优先权。请参阅 SETLOCAL /? 获取详细信息。

命令扩展包括对下列命令所做的
更改和/或添加:

    DEL or ERASE
    COLOR
    CD or CHDIR
    MD or MKDIR
    PROMPT
    PUSHD
    POPD
    SET
    SETLOCAL
    ENDLOCAL
    IF
    FOR
    CALL
    SHIFT
    GOTO
    START (同时包括对外部命令调用所做的更改)
    ASSOC
    FTYPE

有关特定详细信息,请键入 commandname /? 查看。

延迟环境变量扩展不按默认值启用。您
可以用/V:ON 或 /V:OFF 开关,为 CMD.EXE 的某个调用而
启用或停用延迟环境变量扩展。您
可以在机器上和/或用户登录会话上启用或停用 CMD.EXE 所有
调用的延迟扩展,这要通过设置使用 REGEDIT.EXE 的注册表中的
一个或两个 REG_DWORD 值:

    HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\DelayedExpansion

        和/或

    HKEY_CURRENT_USER\Software\Microsoft\Command Processor\DelayedExpansion

到 0x1 或 0x0。用户特定设置
比机器设置有优先权。命令行开关
比注册表设置有优先权。

在批处理文件中,SETLOCAL ENABLEDELAYEDEXPANSION 或 DISABLEDELAYEDEXPANSION
参数比 /V:ON 或 /V:OFF 开关有优先权。请参阅 SETLOCAL /?
获取详细信息。

如果延迟环境变量扩展被启用,
惊叹号字符可在执行时间被用来
代替一个环境变量的数值。

您可以用 /F:ON 或 /F:OFF 开关为 CMD.EXE 的某个
调用而启用或禁用文件名完成。您可以在计算上和/或
用户登录会话上启用或禁用 CMD.EXE 所有调用的完成,
这可以通过使用 REGEDIT.EXE 设置注册表中的下列
REG_DWORD 的全部或其中之一:

    HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\CompletionChar
    HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\PathCompletionChar

        和/或

    HKEY_CURRENT_USER\Software\Microsoft\Command Processor\CompletionChar
    HKEY_CURRENT_USER\Software\Microsoft\Command Processor\PathCompletionChar

由一个控制字符的十六进制值作为一个特定参数(例如,0x4
是Ctrl-D,0x6 是 Ctrl-F)。用户特定设置优先于机器设置。
命令行开关优先于注册表设置。

如果完成是用 /F:ON 开关启用的,两个要使用的控制符是:
目录名完成用 Ctrl-D,文件名完成用 Ctrl-F。要停用
注册表中的某个字符,请用空格(0x20)的数值,因为此字符
不是控制字符。

如果键入两个控制字符中的一个,完成会被调用。完成功能将
路径字符串带到光标的左边,如果没有通配符,将通配符附加
到左边,并建立相符的路径列表。然后,显示第一个相符的路
径。如果没有相符的路径,则发出嘟嘟声,不影响显示。之后,
重复按同一个控制字符会循环显示相符路径的列表。将 Shift
键跟控制字符同时按下,会倒着显示列表。如果对该行进行了
任何编辑,并再次按下控制字符,保存的相符路径的列表会被
丢弃,新的会被生成。如果在文件和目录名完成之间切换,会
发生同样现象。两个控制字符之间的唯一区别是文件完成字符
符合文件和目录名,而目录完成字符只符合目录名。如果文件
完成被用于内置式目录命令(CD、MD 或 RD),就会使用目录
完成。
用引号将相符路径括起来,完成代码可以正确处理含有空格
或其他特殊字符的文件名。同时,如果备份,然后从行内调用
文件完成,完成被调用时位于光标右方的文字会被调用。

需要引号的特殊字符是:
     <space>
     ()[]{}^=;!'+,`~(&()


D:\>help color
设置默认的控制台前景和背景颜色。

COLOR [attr]

  attr        指定控制台输出的颜色属性

颜色属性由两个十六进制数字指定 -- 第一个为背景,第二个则为
前景。每个数字可以为以下任何值之一:

    0 = 黑色       8 = 灰色
    1 = 蓝色       9 = 淡蓝色
    2 = 绿色       A = 淡绿色
    3 = 浅绿色     B = 淡浅绿色
    4 = 红色       C = 淡红色
    5 = 紫色       D = 淡紫色
    6 = 黄色       E = 淡黄色
    7 = 白色       F = 亮白色

如果没有给定任何参数,该命令会将颜色还原到 CMD.EXE 启动时
的颜色。这个值来自当前控制台窗口、/T 命令行开关或
DefaultColor 注册表值。

如果用相同的前景和背景颜色来执行 COLOR 命令,COLOR 命令
会将 ERRORLEVEL 设置为 1。

例如: "COLOR fc" 在亮白色上产生亮红色

D:\>help comp
比较两个文件或两个文件集的内容。

COMP [data1] [data2] [/D] [/A] [/L] [/N=number] [/C] [/OFF[LINE]]

  data1      指定要比较的第一个文件的位置和名称。
  data2      指定要比较的第二个文件的位置和名称。
  /D         以十进制格式显示差异。
  /A         以 ASCII 字符显示差异。
  /L         显示不同的行数。
  /N=number  只比较每个文件中第一个指定的行数。
  /C         比较文件时 ASCII 字母不区分大小写。
  /OFF[LINE] 不要跳过带有脱机属性集的文件。

要比较文件集,请在 data1 和 data2 参数中使用通配符。

D:\>help compact
显示或改变 NTFS 分区上文件的压缩.

COMPACT [/C | /U] [/S[:dir]] [/A] [/I] [/F] [/Q] [filename [...]]

  /C        压缩指定的文件。会给目录作标记,这样以后添加的文件
            会得到压缩。
  /U        解压缩指定的文件。会给目录作标记,这样以后添加的文
            件不会得到压缩。
  /S        在指定的目录和所有子目录中的文件上执行指定操作。
            默认 "dir"是当前目录。
  /A        显示具有隐藏或系统属性的文件。在默认
            情况下,这些文件都是被忽略的。
  /I        即使在错误发生后,依然继续执行指定的操作。在默认情况
            下,COMPACT 在遇到错误时会停止。
  /F        在所有指定文件上强制压缩操作,包括已被压缩的文件。
            在默认情况下,已经压缩的文件被忽略。
  /Q        只报告最重要的信息。
  filename  指定类型、文件和目录。

  不跟参数一起使用时,COMPACT 显示当前目录及其所含文件的
  压缩状态。您可以使用多个文件名和通配符。在多个参数之间
  必须加空格。

D:\>help convvert
帮助工具不支持此命令。请尝试“convvert /?”。

D:\>help convert
将 FAT 卷转换为 NTFS。

CONVERT volume /FS:NTFS [/V] [/CvtArea:filename] [/NoSecurity] [/X]


  volume      指定驱动器号(后面跟一个冒号)、装入点或卷名。
  /FS:NTFS    指定要将此卷转换为 NTFS。
  /V          指定将在详细模式下运行 Convert。
  /CvtArea:filename
              指定根目录中的一个连续文件,该文件
              将是 NTFS 系统文件的占位符。
  /NoSecurity 指定所有用户均可以访问
              转换文件和目录的安全设置。
  /X          如果必要,请先强制卸除卷。
              该卷的所有打开句柄将会无效。


D:\>help copy
将一份或多份文件复制到另一个位置。

COPY [/D] [/V] [/N] [/Y | /-Y] [/Z] [/L] [/A | /B ] source [/A | /B]
     [+ source [/A | /B] [+ ...]] [destination [/A | /B]]

  source       指定要复制的文件。
  /A           表示一个 ASCII 文本文件。
  /B           表示一个二进位文件。
  /D           允许解密要创建的目标文件
  destination  为新文件指定目录和/或文件名。
  /V           验证新文件写入是否正确。
  /N           复制带有非 8dot3 名称的文件时,
               尽可能使用短文件名。
  /Y           不使用确认是否要覆盖现有目标文件
               的提示。
  /-Y          使用确认是否要覆盖现有目标文件
               的提示。
  /Z           用可重新启动模式复制已联网的文件。
/L           如果源是符号链接,请将链接复制
               到目标而不是源链接指向的实际文件。

命令行开关 /Y 可以在 COPYCMD 环境变量中预先设定。
这可能会被命令行上的 /-Y 替代。除非 COPY
命令是在一个批处理脚本中执行的,默认值应为
在覆盖时进行提示。

要附加文件,请为目标指定一个文件,为源指定
数个文件(用通配符或 file1+file2+file3 格式)。

D:\>help date
显示或设置日期。

DATE [/T | date]

显示当前日期设置和输入新日期的提示,请键入
不带参数的 DATE。要保留现有日期,请按 Enter。

如果命令扩展被启用,DATE 命令会支持 /T 开关;
该开关指示命令只输出当前日期,但不提示输入新日期。

D:\>help del
删除一个或数个文件。

DEL [/P] [/F] [/S] [/Q] [/A[[:]attributes]] names
ERASE [/P] [/F] [/S] [/Q] [/A[[:]attributes]] names

  names         指定一个或多个文件或者目录列表。
                通配符可用来删除多个文件。
                如果指定了一个目录,该目录中的所
                有文件都会被删除。

  /P            删除每一个文件之前提示确认。
  /F            强制删除只读文件。
  /S            删除所有子目录中的指定的文件。
  /Q            安静模式。删除全局通配符时,不要求确认
  /A            根据属性选择要删除的文件
  属性          R  只读文件                     S  系统文件
                H  隐藏文件                     A  存档文件
                I  无内容索引文件               L  重分析点
                -  表示“否”的前缀

如果命令扩展被启用,DEL 和 ERASE 更改如下:

/S 开关的显示句法会颠倒,即只显示已经
删除的文件,而不显示找不到的文件。

D:\>help dir
显示目录中的文件和子目录列表。

DIR [drive:][path][filename] [/A[[:]attributes]] [/B] [/C] [/D] [/L] [/N]
  [/O[[:]sortorder]] [/P] [/Q] [/R] [/S] [/T[[:]timefield]] [/W] [/X] [/4]

  [drive:][path][filename]
              指定要列出的驱动器、目录和/或文件。

  /A          显示具有指定属性的文件。
  属性         D  目录                R  只读文件
               H  隐藏文件            A  准备存档的文件
               S  系统文件            I  无内容索引文件
               L  解析点             -  表示“否”的前缀
  /B          使用空格式(没有标题信息或摘要)。
  /C          在文件大小中显示千位数分隔符。这是默认值。用 /-C 来
              禁用分隔符显示。
  /D          跟宽式相同,但文件是按栏分类列出的。
  /L          用小写。
  /N          新的长列表格式,其中文件名在最右边。
  /O          用分类顺序列出文件。
  排列顺序     N  按名称(字母顺序)     S  按大小(从小到大)
               E  按扩展名(字母顺序)   D  按日期/时间(从先到后)
               G  组目录优先           -  反转顺序的前缀
  /P          在每个信息屏幕后暂停。
  /Q          显示文件所有者。
  /R          显示文件的备用数据流。
  /S          显示指定目录和所有子目录中的文件。
  /T          控制显示或用来分类的时间字符域。
  时间段      C  创建时间
              A  上次访问时间
              W  上次写入的时间
  /W          用宽列表格式。
  /X          显示为非 8.3 文件名产生的短名称。格式是 /N 的格式,
              短名称插在长名称前面。如果没有短名称,在其位置则
              显示空白。
  /4          用四位数字显示年

可以在 DIRCMD 环境变量中预先设定开关。通过添加前缀 - (破折号)
来替代预先设定的开关。例如,/-W。

D:\>help diskcomp
比较两张软盘的内容。

DISKCOMP [drive1: [drive2:]]


D:\>help diskcopy
把一张软盘的内容复制到另一张。

DISKCOPY [drive1: [drive2:]] [/V]

  /V   验证信息是否已正确复制。

两张软盘的类型必须相同。
您可以为 drive1 和 drive2 指定同样的驱动器。

D:\>help diskpart

Microsoft DiskPart 版本 6.1.7601
Copyright (C) 1999-2008 Microsoft Corporation.
在计算机上: 2012-20150127UX

Microsoft DiskPart 语法:
        diskpart [/s <script>] [/?]

        /s <script> - 使用一个 DiskPart 脚本。
        /?          - 显示这个帮助屏幕。

D:\>help doskey
编辑命令行,重新调用 Windows 命令,并创建宏。

DOSKEY [/REINSTALL] [/LISTSIZE=size] [/MACROS[:ALL | :exename]]
  [/HISTORY] [/INSERT | /OVERSTRIKE] [/EXENAME=exename] [/MACROFILE=filename]
  [macroname=[text]]

  /REINSTALL          安装新的 Doskey 副本。
  /LISTSIZE=size      设置命令历史记录的缓冲区大小。
  /MACROS             显示所有 Doskey 宏。
  /MACROS:ALL         为具有 Doskey 宏的所有可执行文件显示
所有 Doskey 宏。
  /MACROS:exename     显示指定可执行文件的所有 Doskey 宏。
  /HISTORY            显示存储在内存中的所有命令。
  /INSERT             指定您键入的新文本插入到旧文本中。
  /OVERSTRIKE         指定新文本覆盖旧文本。
  /EXENAME=exename    指定可执行文件。
  /MACROFILE=filename 指定要安装的宏文件。
  macroname           指定您创建的宏的名称。
  text                指定要录制的命令。

上下箭头 重新调用命令;Esc 清除命令行;F7
显示命令历史记录;Alt+F7 清除
命令历史记录;F8 搜索命令历史记录;F9 按编号选择命令;Alt+F10 清除宏定义。

以下是 Doskey 宏定义的一些特殊代码:
$T     命令分隔符。允许一个宏中存在多个命令。
$1-$9  批处理参数。与批处理程序中的 %1-%9 等同。
$*     以命令行中命令名称后面的任何内容替换的符号。

D:\>help driverquery

DRIVERQUERY [/S system [/U username [/P [password]]]]
              [/FO format] [/NH] [/SI] [/V]
描述:
    允许管理员显示已安装设备驱动程序
    的列表。

参数列表:
      /S     system           指定要连接到的远程系统。

      /U     [domain\]user    执行命令执行的用户上下文。

      /P     [password]       指定所给用户上下文的密码。

      /FO    format           指定要显示的结果类型。与命令行开关一起传递
                              的有效值是 "TABLE"、"LIST"、" CSV"。

      /NH                     指定“列标题”不应该在屏幕输出中
                              出现。只对 "TABLE" 和 "CSV" 格式有效。

      /SI                     提供有关已签名驱动程序的信息。

      /V                      显示详细任务输出。对签名的驱动程序无效。

      /?                      显示该帮助消息。

示例:
    DRIVERQUERY
    DRIVERQUERY /FO CSV /SI
    DRIVERQUERY /NH
    DRIVERQUERY /S ipaddress /U user /V
    DRIVERQUERY /S system /U domain\user /P password /FO LIST

D:\>help echo
显示信息,或将命令回显打开或关上。

  ECHO [ON | OFF]
  ECHO [message]

要显示当前回显设置,键入不带参数的 ECHO。

D:\>help endlocal
结束批处理文件中环境改动的本地化操作。在执行ENDLOCAL 之后
所做的环境改动不再仅限于批处理文件。批处理文件结束后,
原先的设置无法还原。

ENDLOCAL

如果命令扩展被启用,ENDLOCAL 会如下改变:

如果相应的 SETLOCAL 用新的 ENABLEEXTENSIONS 或
DISABLEEXTENSIONS 选项启用或停用了命令扩展,那么,在
ENDLOCAL 之后,命令扩展的启用/停用状态会还原到执行
相应的 SETLOCAL 命令前的状态。

D:\>help erase
删除一个或数个文件。

DEL [/P] [/F] [/S] [/Q] [/A[[:]attributes]] names
ERASE [/P] [/F] [/S] [/Q] [/A[[:]attributes]] names

  names         指定一个或多个文件或者目录列表。
                通配符可用来删除多个文件。
                如果指定了一个目录,该目录中的所
                有文件都会被删除。

  /P            删除每一个文件之前提示确认。
  /F            强制删除只读文件。
  /S            删除所有子目录中的指定的文件。
  /Q            安静模式。删除全局通配符时,不要求确认
  /A            根据属性选择要删除的文件
  属性          R  只读文件                     S  系统文件
                H  隐藏文件                     A  存档文件
                I  无内容索引文件               L  重分析点
                -  表示“否”的前缀

如果命令扩展被启用,DEL 和 ERASE 更改如下:

/S 开关的显示句法会颠倒,即只显示已经
删除的文件,而不显示找不到的文件。

D:\>help exit
退出 CMD.EXE 程序(命令解释器)或当前批处理脚本。

EXIT [/B] [exitCode]

  /B          指定要退出当前批处理脚本而不是 CMD.EXE。如果从一个
              批处理脚本外执行,则会退出 CMD.EXE

  exitCode    指定一个数字号码。如果指定了 /B,将 ERRORLEVEL
              设成那个数字。如果退出 CMD.EXE,则用那个数字设置
              过程退出代码。


D:\>help fc
比较两个文件或两个文件集并显示它们之间
的不同


FC [/A] [/C] [/L] [/LBn] [/N] [/OFF[LINE]] [/T] [/U] [/W] [/nnnn]
   [drive1:][path1]filename1 [drive2:][path2]filename2
FC /B [drive1:][path1]filename1 [drive2:][path2]filename2

  /A         只显示每个不同处的第一行和最后一行。
  /B         执行二进制比较。
  /C         不分大小写。
  /L         将文件作为 ASCII 文字比较。
  /LBn       将连续不匹配的最大值设置为指定
             的行数。
  /N         在 ASCII 比较上显示行数。
  /OFF[LINE] 不要跳过带有脱机属性集的文件。
  /T         不要将制表符扩充到空格。
  /U         将文件作为 UNICODE 文本文件比较。
  /W         为了比较而压缩空白(制表符和空格)。
  /nnnn      指定不匹配处后必须连续
             匹配的行数。
  [drive1:][path1]filename1
             指定要比较的第一个文件或第一个文件集。
  [drive2:][path2]filename2
             指定要比较的第二个文件或第二个文件集。


D:\>help find
在文件中搜索字符串。

FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] "string" [[drive:][path]filename[ ...]]

  /V         显示所有未包含指定字符串的行。
  /C         仅显示包含字符串的行数。
  /N         显示行号。
  /I         搜索字符串时忽略大小写。
  /OFF[LINE] 不要跳过具有脱机属性集的文件。
  "string" 指定要搜索的文本字符串。
  [drive:][path]filename
             指定要搜索的文件。

如果没有指定路径,FIND 将搜索在提示符处键入
的文本或者由另一命令产生的文本。

D:\>help findstr
在文件中寻找字符串。

FINDSTR [/B] [/E] [/L] [/R] [/S] [/I] [/X] [/V] [/N] [/M] [/O] [/P] [/F:file]
        [/C:string] [/G:file] [/D:dir list] [/A:color attributes] [/OFF[LINE]]
        strings [[drive:][path]filename[ ...]]

  /B         在一行的开始配对模式。
  /E         在一行的结尾配对模式。
  /L         按字使用搜索字符串。
  /R         将搜索字符串作为一般表达式使用。
  /S         在当前目录和所有子目录中搜索匹配文件。
  /I         指定搜索不分大小写。
  /X         打印完全匹配的行。
  /V         只打印不包含匹配的行。
  /N         在匹配的每行前打印行数。
  /M         如果文件含有匹配项,只打印其文件名。
  /O         在每个匹配行前打印字符偏移量。
  /P         忽略有不可打印字符的文件。
  /OFF[LINE] 不跳过带有脱机属性集的文件。
  /A:attr    指定有十六进位数字的颜色属性。请见 "color /?"
  /F:file    从指定文件读文件列表 (/ 代表控制台)。
  /C:string  使用指定字符串作为文字搜索字符串。
  /G:file    从指定的文件获得搜索字符串。 (/ 代表控制台)。
  /D:dir     查找以分号为分隔符的目录列表
  strings    要查找的文字。
  [drive:][path]filename
             指定要查找的文件。

除非参数有 /C 前缀,请使用空格隔开搜索字符串。
例如: 'FINDSTR "hello there" x.y' 在文件 x.y 中寻找 "hello" 或
"there"。'FINDSTR /C:"hello there" x.y' 文件 x.y  寻找
"hello there"。

一般表达式的快速参考:
  .        通配符: 任何字符
  *        重复: 以前字符或类出现零或零以上次数
  ^        行位置: 行的开始
  $        行位置: 行的终点
  [class]  字符类: 任何在字符集中的字符
  [^class] 补字符类: 任何不在字符集中的字符
  [x-y]    范围: 在指定范围内的任何字符
  \x       Escape: 元字符 x 的文字用法
  \<xyz    字位置: 字的开始
  xyz\>    字位置: 字的结束

有关 FINDSTR 常见表达法的详细情况,请见联机命令参考。

D:\>help for
对一组文件中的每一个文件执行某个特定命令。

FOR %variable IN (set) DO command [command-parameters]

  %variable  指定一个单一字母可替换的参数。
  (set)      指定一个或一组文件。可以使用通配符。
  command    指定对每个文件执行的命令。
  command-parameters
             为特定命令指定参数或命令行开关。

在批处理程序中使用 FOR 命令时,指定变量请使用 %%variable
而不要用 %variable。变量名称是区分大小写的,所以 %i 不同于 %I.

如果启用命令扩展,则会支持下列 FOR 命令的其他格式:

FOR /D %variable IN (set) DO command [command-parameters]

    如果集中包含通配符,则指定与目录名匹配,而不与文件名匹配。

FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]

    检查以 [drive:]path 为根的目录树,指向每个目录中的 FOR 语句。
    如果在 /R 后没有指定目录规范,则使用当前目录。如果集仅为一个单点(.)字符,
    则枚举该目录树。

FOR /L %variable IN (start,step,end) DO command [command-parameters]

    该集表示以增量形式从开始到结束的一个数字序列。因此,(1,1,5)将产生序列
    1 2 3 4 5,(5,-1,1)将产生序列(5 4 3 2 1)

FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
FOR /F ["options"] %variable IN ('command') DO command [command-parameters]

    或者,如果有 usebackq 选项:

FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
FOR /F ["options"] %variable IN ('command') DO command [command-parameters]

    fileset 为一个或多个文件名。继续到 fileset 中的下一个文件之前,
    每份文件都被打开、读取并经过处理。处理包括读取文件,将其分成一行行的文字,
    然后将每行解析成零或更多的符号。然后用已找到的符号字符串变量值调用 For 循环

    以默认方式,/F 通过每个文件的每一行中分开的第一个空白符号。跳过空白行。
    您可通过指定可选 "options" 参数替代默认解析操作。这个带引号的字符串包括一个
    或多个指定不同解析选项的关键字。这些关键字为:

        eol=c           - 指一个行注释字符的结尾(就一个)
        skip=n          - 指在文件开始时忽略的行数。
        delims=xxx      - 指分隔符集。这个替换了空格和跳格键的
                          默认分隔符集。
        tokens=x,y,m-n  - 指每行的哪一个符号被传递到每个迭代
                          的 for 本身。这会导致额外变量名称的分配。m-n
                          格式为一个范围。通过 nth 符号指定 mth。如果
                          符号字符串中的最后一个字符星号,
                          那么额外的变量将在最后一个符号解析之后
                          分配并接受行的保留文本。
        usebackq        - 指定新语法已在下类情况中使用:
                          在作为命令执行一个后引号的字符串并且一个单
                          引号字符为文字字符串命令并允许在 file-set
                          中使用双引号扩起文件名称。

    某些范例可能有助:

FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k

    会分析 myfile.txt 中的每一行,忽略以分号打头的那些行,将
    每行中的第二个和第三个符号传递给 for 函数体,用逗号和/或
    空格分隔符号。请注意,此 for 函数体的语句引用 %i 来
    获得第二个符号,引用 %j 来获得第三个符号,引用 %k
    来获得第三个符号后的所有剩余符号。对于带有空格的文件
    名,您需要用双引号将文件名括起来。为了用这种方式来使
    用双引号,还需要使用 usebackq 选项,否则,双引号会
    被理解成是用作定义某个要分析的字符串的。

    %i 在 for 语句中显式声明,%j 和 %k 是通过
    tokens= 选项隐式声明的。可以通过 tokens= 一行
    指定最多 26 个符号,只要不试图声明一个高于字母 "z" 或
    "Z" 的变量。请记住,FOR 变量是单一字母、分大小写和全局的变量;
    而且,不能同时使用超过 52 个。

    还可以在相邻字符串上使用 FOR /F 分析逻辑,方法是,
    用单引号将括号之间的 file-set 括起来。这样,该字符
    串会被当作一个文件中的一个单一输入行进行解析。

    最后,可以用 FOR /F 命令来分析命令的输出。方法是,将
    括号之间的 file-set 变成一个反括字符串。该字符串会
    被当作命令行,传递到一个子 CMD.EXE,其输出会被捕获到
    内存中,并被当作文件分析。如以下例子所示:

      FOR /F "usebackq delims==" %i IN (`set`) DO @echo %i

    会枚举当前环境中的环境变量名称。

另外,FOR 变量参照的替换已被增强。您现在可以使用下列
选项语法:

     %~I          - 删除任何引号("),扩展 %I
     %~fI        - 将 %I 扩展到一个完全合格的路径名
     %~dI        - 仅将 %I 扩展到一个驱动器号
     %~pI        - 仅将 %I 扩展到一个路径
     %~nI        - 仅将 %I 扩展到一个文件名
     %~xI        - 仅将 %I 扩展到一个文件扩展名
     %~sI        - 扩展的路径只含有短名
     %~aI        - 将 %I 扩展到文件的文件属性
     %~tI        - 将 %I 扩展到文件的日期/时间
     %~zI        - 将 %I 扩展到文件的大小
     %~$PATH:I   - 查找列在路径环境变量的目录,并将 %I 扩展
                   到找到的第一个完全合格的名称。如果环境变量名
                   未被定义,或者没有找到文件,此组合键会扩展到
                   空字符串

可以组合修饰符来得到多重结果:

     %~dpI       - 仅将 %I 扩展到一个驱动器号和路径
     %~nxI       - 仅将 %I 扩展到一个文件名和扩展名
     %~fsI       - 仅将 %I 扩展到一个带有短名的完整路径名
     %~dp$PATH:I - 搜索列在路径环境变量的目录,并将 %I 扩展
                   到找到的第一个驱动器号和路径。
     %~ftzaI     - 将 %I 扩展到类似输出线路的 DIR

在以上例子中,%I 和 PATH 可用其他有效数值代替。%~ 语法
用一个有效的 FOR 变量名终止。选取类似 %I 的大写变量名
比较易读,而且避免与不分大小写的组合键混淆。

D:\>help foemat
帮助工具不支持此命令。请尝试“foemat /?”。

D:\>help format
格式化磁盘以供 Windows 使用。

FORMAT volume [/FS:file-system] [/V:label] [/Q] [/A:size] [/C] [/X] [/P:passes]
[/S:state]
FORMAT volume [/V:label] [/Q] [/F:size] [/P:passes]
FORMAT volume [/V:label] [/Q] [/T:tracks /N:sectors] [/P:passes]
FORMAT volume [/V:label] [/Q] [/P:passes]
FORMAT volume [/Q]

  volume          指定驱动器号(后面跟一个冒号)、装入点或卷名。
  /FS:filesystem 指定文件系统的类型(FAT、FAT32、exFAT、NTFS、或 UDF)。
  /V:label        指定卷标。
  /Q              执行快速格式化。请注意,此开关可替代 /P。
  /C              仅适于 NTFS: 默认情况下,将压缩在该新建卷上创建的
                  文件。
  /X              如果必要,请先强制卸除卷。该卷的所有打开句柄
                  不再有效。
  /R:revision     仅 UDF: 强制格式化为特定的 UDF 版本
                  (1.02、1.50、2.00、2.01、2.50)。
                  默认 修订版为 2.01。
  /D              仅适用于 UDF 2.50: 将复制元数据。
  /A:size         替代默认分配单元大小。强烈建议您在通常情况下使用默认 设置。
                  NTFS 支持 512、1024、2048、4096、8192、16K、32K、64K。
                  FAT 支持 512、1024、2048、4096、8192、16K、32K、64k,
                  (128k、256k 用于大于 512 个字节的扇区)。 FAT32 支持 512、
                  1024、2048、4096、8192、16k、32k、64k, (128k 、256k 用于
                  大于 512 个字节的扇区)。EXFAT 支持 512、1024、2048、4096、
                  8192、16K、32K、64K、 128K、256K、512k、1M、2M、4M、8M、16M、
                  32M。

                  请注意,FAT 及 FAT32 文件系统对卷上的群集数量施加以下限制:

                  FAT: 群集数量 <= 65526 FAT32: 65526 < 群集数量 < 4177918

                  如果判定使用指定的群集大小无法满足以上需求,将立即停止格式化。


                  大于 4096 的分配单元大小不支持 NTFS 压缩。

  /F:size 指定要格式化的软盘大小(1.44)
  /T:tracks       为磁盘指定每面磁道数。
  /N:sectors      指定每条磁道的扇区数。
  /P:passes       将卷上每个扇区的操作次数清零。
                  此开关对 /Q 无效
  /S:state        其中 "state" 为 "enable" 或 "disable"
                  默认情况下启用了短名称


D:\>help fsutil
/? 是无效参数。
---- 支持的命令 ----

8dot3name       8dot3name 管理
behavior        控制文件系统行为
dirty           管理卷的已损坏位数
file            文件特定命令
fsinfo          文件系统信息
hardlink        硬链接管理
objectid        对象 ID 管理
quota           配额管理
repair          自疗管理
reparsepoint    重分析点管理
resource        事务资源管理器管理
sparse          稀疏文件控制
transaction     事务管理
usn             USN 管理
volume          卷管理

D:\>help ftype
显示或修改用在文件扩展名关联中的文件类型

FTYPE [fileType[=[openCommandString]]]

  fileType  指定要检查或改变的文件类型
  openCommandString 指定调用这类文件时要使用的开放式命令。

键入 FTYPE 而不带参数来显示当前有定义的开放式命令字符串的
文件类型。FTYPE 仅用一个文件类型启用时,它显示那个文件类
型目前的开放式命令字符串。如果不为开放式命令字符串指定,
FTYPE 命令将删除那个文件类型的开放式命令字符串。在一个
开放式命令字符串之内,命令字符串 %0 或 %1 被通过关联调用
的文件名所代替。%* 得到所有的参数,%2 得到第一个参数,
%3 得到第二个,等等。%~n 得到其余所有以 nth 参数打头的
参数;n 可以是从 2 到 9 的数字。例如:

    ASSOC .pl=PerlScript
    FTYPE PerlScript=perl.exe %1 %*

允许您启用以下 Perl 脚本:

    script.pl 1 2 3

如果不想键入扩展名,则键入以下字符串:

    set PATHEXT=.pl;%PATHEXT%

被启动的脚本如下:

    script 1 2 3

D:\>help goto
将 cmd.exe 定向到批处理程序中带标签的行。

GOTO label

  label   指定批处理程序中用作标签的文字字符串。

标签必须单独一行,并且以冒号打头。

如果命令扩展被启用,GOTO 会如下改变:

GOTO 命令现在接受目标标签 :EOF,这个标签将控制转移到当前
批脚本文件的结尾。不定义就退出批脚本文件,这是一个容易的
办法。有关能使该功能有用的 CALL 命令的扩展描述,请键入
CALL /?。

D:\>help gpresult

GPRESULT [/S system [/U username [/P [password]]]] [/SCOPE scope]
           [/USER targetusername] [/R | /V | /Z] [(/X | /H) <filename> [/F]]

描述:
    此命令行工具显示目标用户和计算机的策略结果集 (RSoP) 的信息。

参数列表:
    /S        system           指定要连接到的远程系统。

    /U        [domain\]user    指定命令应在其下执行的
                               用户上下文。
                               无法与 /X、/H 一起使用。

    /P        [password]       为给定的用户上下文指定密码。如果省
                               略则提示输入。
                               无法与 /X、/H 一起使用。

    /SCOPE    scope            指定是显示用户还是计算机设置。
                               有效值: "USER","COMPUTER"。

    /USER     [domain\]user    指定要显示 RSOP 的用户名称。



    /X        <filename>       以 XML 格式将报告保存该位置,
                               并使用由
                               <filename> 参数指定的文件名。(在 Windows
                               Vista SP1 和更高版本以及 Windows Server 2008 和更
高版本中有效)

    /H        <filename>       以 HTML 格式将报告保存该位置,
                               并使用由
                               <filename> 参数指定的文件名。(在 Windows
                               Vista SP1 和更高版本以及 Windows Server 2008 和更
高版本中有效)

    /F                         强制 gpresult 覆盖在
                               /X 或 /H 命令中指定的文件名。

    /R                         显示 RSoP 摘要数据。

    /V                         指定要显示详细信息。详细信息提供
                               已经应用的、优先权是 1 的详细设置。



    /Z                         指定显示超详细信息。超详细信息提供其他
                               详细设置,用 1 或更高的优先权应用于此
                               设置。这允许您查看是否在多处设置了某一
                               设置。请参阅组策略联机帮助主题获得更多
                               信息。




    /?                         显示该帮助消息。


示例:
    GPRESULT /R
    GPRESULT /H GPReport.html
    GPRESULT /USER targetusername /V
    GPRESULT /S system /USER targetusername /SCOPE COMPUTER /Z
    GPRESULT /S system /U username /P password /SCOPE USER /V

D:\>help graftabl
Enable Windows to display an extended character set in graphics mode.

GRAFTABL [xxx]
GRAFTABL /STATUS

   xxx      Specifies a code page number.
   /STATUS  Displays the current code page selected for use with GRAFTABL.


D:\>help help
提供 Windows 命令的帮助信息。

HELP [command]

    command - 显示该命令的帮助信息。

D:\>help icacls

ICACLS name /save aclfile [/T] [/C] [/L] [/Q]
    将匹配名称的文件和文件夹的 DACL 存储到 aclfile 中以便将来与
    /restore 一起使用。请注意,未保存 SACL、所有者或完整性标签。

ICACLS directory [/substitute SidOld SidNew [...]] /restore aclfile
                 [/C] [/L] [/Q]
    将存储的 DACL 应用于目录中的文件。

ICACLS name /setowner user [/T] [/C] [/L] [/Q]
    更改所有匹配名称的所有者。该选项不会强制更改所有身份;
    使用 takeown.exe 实用程序可实现该目的。

ICACLS name /findsid Sid [/T] [/C] [/L] [/Q]
    查找包含显式提及 SID 的 ACL 的所有匹配名称。

ICACLS name /verify [/T] [/C] [/L] [/Q]
    查找其 ACL 不规范或长度与 ACE 计数不一致的所有文件。

ICACLS name /reset [/T] [/C] [/L] [/Q]
    为所有匹配文件使用默认继承的 ACL 替换 ACL。

ICACLS name [/grant[:r] Sid:perm[...]]
       [/deny Sid:perm [...]]
       [/remove[:g|:d]] Sid[...]] [/T] [/C] [/L]
       [/setintegritylevel Level:policy[...]]

    /grant[:r] Sid:perm 授予指定的用户访问权限。如果使用 :r,
        这些权限将替换以前授予的所有显式权限。
        如果不使用 :r,这些权限将添加到以前授予的所有显式权限。

    /deny Sid:perm 显式拒绝指定的用户访问权限。
        将为列出的权限添加显式拒绝 ACE,
        并删除所有显式授予的权限中的相同权限。

    /remove[:[g|d]] Sid 删除 ACL 中所有出现的 SID。使用
        :g,将删除授予该 SID 的所有权限。使用
        :d,将删除拒绝该 SID 的所有权限。

    /setintegritylevel [(CI)(OI)] 级别将完整性 ACE 显式添加到所有
        匹配文件。要指定的级别为以下级别之一:
            L[ow]
            M[edium]
            H[igh]
        完整性 ACE 的继承选项可以优先于级别,但只应用于
        目录。

    /inheritance:e|d|r
        e - 启用继承
        d - 禁用继承并复制 ACE
        r - 删除所有继承的 ACE


注意:
    Sid 可以采用数字格式或友好的名称格式。如果给定数字格式,
    那么请在 SID 的开头添加一个 *。

    /T 指示在以该名称指定的目录下的所有匹配文件/目录上
        执行此操作。

    /C 指示此操作将在所有文件错误上继续进行。仍将显示错误消息。

    /L 指示此操作在符号链接本身而不是其目标上执行。

    /Q 指示 icacls 应该禁止显示成功消息。

    ICACLS 保留 ACE 项的规范顺序:
            显式拒绝
            显式授予
            继承的拒绝
            继承的授予

    perm 是权限掩码,可以两种格式之一指定:
        简单权限序列:
                N - 无访问权限
                F - 完全访问权限
                M - 修改权限
                RX - 读取和执行权限
                R - 只读权限
                W - 只写权限
                D - 删除权限
        在括号中以逗号分隔的特定权限列表:
                DE - 删除
                RC - 读取控制
                WDAC - 写入 DAC
                WO - 写入所有者
                S - 同步
                AS - 访问系统安全性
                MA - 允许的最大值
                GR - 一般性读取
                GW - 一般性写入
                GE - 一般性执行
                GA - 全为一般性
                RD - 读取数据/列出目录
                WD - 写入数据/添加文件
                AD - 附加数据/添加子目录
                REA - 读取扩展属性
                WEA - 写入扩展属性
                X - 执行/遍历
                DC - 删除子项
                RA - 读取属性
                WA - 写入属性
        继承权限可以优先于每种格式,但只应用于
        目录:
                (OI) - 对象继承
                (CI) - 容器继承
                (IO) - 仅继承
                (NP) - 不传播继承
                (I) - 从父容器继承的权限

示例:

        icacls c:\windows\* /save AclFile /T
        - 将 c:\windows 及其子目录下所有文件的
           ACL 保存到 AclFile。

        icacls c:\windows\ /restore AclFile
        - 将还原 c:\windows 及其子目录下存在的 AclFile 内
          所有文件的 ACL。

        icacls file /grant Administrator:(D,WDAC)
        - 将授予用户对文件删除和写入 DAC 的管理员权限。

        icacls file /grant *S-1-1-0:(D,WDAC)
        - 将授予由 sid S-1-1-0 定义的用户对文件删除和写入 DAC 的权限。


D:\>help if
执行批处理程序中的条件处理。

IF [NOT] ERRORLEVEL number command
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command

  NOT               指定只有条件为 false 的情况下,Windows 才
                    应该执行该命令。

  ERRORLEVEL number 如果最后运行的程序返回一个等于或大于
                    指定数字的退出代码,指定条件为 true。

  string1==string2  如果指定的文字字符串匹配,指定条件为 true。

  EXIST filename    如果指定的文件名存在,指定条件为 true。

  command           如果符合条件,指定要执行的命令。如果指定的
                    条件为 FALSE,命令后可跟 ELSE 命令,该命令将
                    在 ELSE 关键字之后执行该命令。

ELSE 子句必须出现在同一行上的 IF 之后。例如:

    IF EXIST filename. (
        del filename.
    ) ELSE (
        echo filename. missing.
    )

由于 del 命令需要用新的一行终止,因此以下子句不会有效:

IF EXIST filename. del filename. ELSE echo filename. missing

由于 ELSE 命令必须与 IF 命令的尾端在同一行上,以下子句也
不会有效:

    IF EXIST filename. del filename.
    ELSE echo filename. missing

如果都放在同一行上,以下子句有效:

    IF EXIST filename. (del filename.) ELSE echo filename. missing

如果命令扩展被启用,IF 会如下改变:

    IF [/I] string1 compare-op string2 command
    IF CMDEXTVERSION number command
    IF DEFINED variable command

其中, compare-op 可以是:

    EQU - 等于
    NEQ - 不等于
    LSS - 小于
    LEQ - 小于或等于
    GTR - 大于
    GEQ - 大于或等于

而 /I 开关(如果指定)说明要进行的字符串比较不分大小写。
/I 开关可以用于 IF 的 string1==string2 的形式上。这些
比较都是通用的;原因是,如果 string1 和 string2 都是
由数字组成的,字符串会被转换成数字,进行数字比较。

CMDEXTVERSION 条件的作用跟 ERRORLEVEL 的一样,除了它
是在跟与命令扩展有关联的内部版本号比较。第一个版本
是 1。每次对命令扩展有相当大的增强时,版本号会增加一个。
命令扩展被停用时,CMDEXTVERSION 条件不是真的。

如果已定义环境变量,DEFINED 条件的作用跟 EXIST 的一样,
除了它取得一个环境变量,返回的结果是 true。

如果没有名为 ERRORLEVEL 的环境变量,%ERRORLEVEL%
会扩充为 ERROLEVEL 当前数值的字符串表达式;否则,您会得到
其数值。运行程序后,以下语句说明 ERRORLEVEL 的用法:

    goto answer%ERRORLEVEL%
    :answer0
    echo Program had return code 0
    :answer1
    echo Program had return code 1

您也可以使用以上的数字比较:

    IF %ERRORLEVEL% LEQ 1 goto okay

如果没有名为 CMDCMDLINE 的环境变量,%CMDCMDLINE%
将在 CMD.EXE 进行任何处理前扩充为传递给 CMD.EXE 的原始
命令行;否则,您会得到其数值。

如果没有名为 CMDEXTVERSION 的环境变量,
%CMDEXTVERSION% 会扩充为 CMDEXTVERSION 当前数值的
字串符表达式;否则,您会得到其数值。

D:\>help label
创建、更改或删除磁盘的卷标。

LABEL [drive:][label]
LABEL [/MP] [volume] [label]

  drive:          指定驱动器号。
  label           指定卷标。
  /MP             指定卷应被视为装入点或卷名。
  volume          指定驱动器号(后面跟一个冒号)、装入点或卷名。
                  如果指定了卷名,/MP 标志则不必要。

D:\>help md
创建目录。

MKDIR [drive:]path
MD [drive:]path

如果命令扩展被启用,MKDIR 会如下改变:

如果需要,MKDIR 会在路径中创建中级目录。例如: 假设 \a 不
存在,那么:

    mkdir \a\b\c\d

与:

    mkdir \a
    chdir \a
    mkdir b
    chdir b
    mkdir c
    chdir c
    mkdir d

相同。如果扩展被停用,则需要键入 mkdir \a\b\c\d。

D:\>help mkdir
创建目录。

MKDIR [drive:]path
MD [drive:]path

如果命令扩展被启用,MKDIR 会如下改变:

如果需要,MKDIR 会在路径中创建中级目录。例如: 假设 \a 不
存在,那么:

    mkdir \a\b\c\d

与:

    mkdir \a
    chdir \a
    mkdir b
    chdir b
    mkdir c
    chdir c
    mkdir d

相同。如果扩展被停用,则需要键入 mkdir \a\b\c\d。

D:\>help mklink
创建符号链接。

MKLINK [[/D] | [/H] | [/J]] Link Target

        /D      创建目录符号链接。默认为文件
                符号链接。
        /H      创建硬链接,而不是符号链接。
        /J      创建目录联接。
        Link    指定新的符号链接名称。
        Target  指定新链接引用的路径
                (相对或绝对)。

D:\>help mode
配置系统设备。

串行端口:          MODE COMm[:] [BAUD=b] [PARITY=p] [DATA=d] [STOP=s]
                                [to=on|off] [xon=on|off] [odsr=on|off]
                                [octs=on|off] [dtr=on|off|hs]
                                [rts=on|off|hs|tg] [idsr=on|off]

设备状态:          MODE [device] [/STATUS]

打印重定向:        MODE LPTn[:]=COMm[:]

选择代码页:        MODE CON[:] CP SELECT=yyy

代码页状态:        MODE CON[:] CP [/STATUS]

显示模式:          MODE CON[:] [COLS=c] [LINES=n]

击键率:            MODE CON[:] [RATE=r DELAY=d]

D:\>help more
逐屏显示输出。

MORE [/E [/C] [/P] [/S] [/Tn] [+n]] < [drive:][path]filename
command-name | MORE [/E [/C] [/P] [/S] [/Tn] [+n]]
MORE /E [/C] [/P] [/S] [/Tn] [+n] [files]

    [drive:][path]filename  指定要逐屏显示的文件。

    command-name            指定要显示其输出的命令。

    /E      启用扩展功能
    /C      显示页面前先清除屏幕
    /P      扩展 FormFeed 字符
    /S      将多个空白行缩成一行
    /Tn     将制表符扩展为 n 个空格(默认值为 8)

            开关可以出现在 MORE 环境变量中。
    +n      从第 n 行开始显示第一个文件

    files   要显示的文件列表。使用空格分隔列表中的文件。
            如果已启用扩展功能,则在 -- More -- 提示处 接受下列命令:
    P n 显示下 n 行
    S n 跳过下 n 行
    F 显示下个文件
    Q 退出
    = 显示行号
    ? 显示帮助行
    <space> 显示下一页
    <ret> 显示下一行

D:\>help move
移动文件并重命名文件和目录。

要移动至少一个文件:
MOVE [/Y | /-Y] [drive:][path]filename1[,...] destination

要重命名一个目录:
MOVE [/Y | /-Y] [drive:][path]dirname1 dirname2

  [drive:][path]filename1 指定您想移动的文件位置和名称。
  destination             指定文件的新位置。目标可包含一个驱动器号
                          和冒号、一个目录名或组合。如果只移动一个文件
                          并在移动时将其重命名,您还可以包括文件名。
  [drive:][path]dirname1  指定要重命名的目录。
  dirname2                指定目录的新名称。

  /Y                      取消确认覆盖一个现有目标文件的提示。
  /-Y                     对确认覆盖一个现有目标文件发出提示。

命令行开关 /Y 可以出现在 COPYCMD 环境变量中。这可以用命令行上
的 /-Y 替代。默认值是,除非 MOVE 命令是从一个批脚本内
执行的,覆盖时都发出提示。

D:\>help openfiles

OPENFILES /parameter [arguments]

描述:
    允许管理员列出或中断系统上已打开的文件和文件夹。

参数列表:
    /Disconnect      中断至少一个打开的文件的连接。

    /Query           显示所有从本地或从共享文件夹打开的文件。

    /Local           启用 / 禁用本地打开文件的显示。

    /?               显示此帮助消息。

示例:
    OPENFILES /Disconnect /?
    OPENFILES /Query /?
    OPENFILES /Local /?



D:\>help path
为可执行文件显示或设置一个搜索路径。

PATH [[drive:]path[;...][;%PATH%]
PATH ;

键入 PATH ; 清除所有搜索路径设置并指示 cmd.exe 只在当前
目录中搜索。
键入 PATH 但不加参数,显示当前路径。
将 %PATH% 包括在新的路径设置中会将旧路径附加到新设置。

D:\>help pause
暂停批处理程序,并显示以下消息:
    请按任意键继续. . .
D:\>help popd
更改到 PUSHD 命令存储的目录。

POPD


如果命令扩展被启用,从推目录堆栈 POPD 驱动器时,POPD
命令会删除 PUSHD 创建的临时驱动器号。

D:\>help print
打印文本文件。

PRINT [/D:device] [[drive:][path]filename[...]]

   /D:device   指定打印设备。


D:\>help prompt
更改 cmd.exe 命令提示符。

PROMPT [text]

  text    指定新的命令提示符。

提示符可以由普通字符及下列特定代码组成:

  $A   & (短 and 符号)
  $B   | (管道)
  $C   ( (左括弧)
  $D   当前日期
  $E   Escape 码(ASCII 码 27)
  $F   ) (右括弧)
  $G   > (大于符号)
  $H   Backspace (擦除前一个字符)
  $L   < (小于符号)
  $N   当前驱动器
  $P   当前驱动器及路径
  $Q   = (等号)
  $S     (空格)
  $T   当前时间
  $V   Windows 版本号
  $_   换行
  $$   $ (货币符号)

如果命令扩展被启用,PROMPT 命令会支持下列格式化字符:

  $+   根据 PUSHD 目录堆栈的深度,零个或零个以上加号(+)字符,
       一个推的层一个字符。

  $M   如果当前驱动器不是网络驱动器,显示跟当前驱动器号或
       空字符串有关联的远程名。

D:\>help pushd
保存当前目录以供 POPD 命令使用,然后改到指定的目录。

PUSHD [path | ..]

  path        指定要成为当前目录的目录。

如果命令扩展被启用,除了一般驱动器号和路径,PUSHD
命令还接受网络路径。如果指定了网络路径,PUSHD 将创建一个
指向指定网络资源的临时驱动器号,然后再用刚定义的驱动器
号更改当前的驱动器和目录。可以从 Z: 往下分配临时驱动器
号,使用找到的第一个没有用过的驱动器号。

D:\>help rd
删除一个目录。

RMDIR [/S] [/Q] [drive:]path
RD [/S] [/Q] [drive:]path

    /S      除目录本身外,还将删除指定目录下的所有子目录和
            文件。用于删除目录树。

    /Q      安静模式,带 /S 删除目录树时不要求确认

D:\>help recover
从损坏的磁盘中恢复可读取的信息。

RECOVER [drive:][path]filename
在使用 RECOVER 命令之前,
请先参阅 Windows 帮助中的联机命令参考。

D:\>help rem
在批处理文件或 CONFIG.SYS 里加上注解或说明。

REM [comment]

D:\>help ren
重命名文件。

RENAME [drive:][path]filename1 filename2.
REN [drive:][path]filename1 filename2.

请注意,您不能为目标文件指定新的驱动器或路径。

D:\>help rename
重命名文件。

RENAME [drive:][path]filename1 filename2.
REN [drive:][path]filename1 filename2.

请注意,您不能为目标文件指定新的驱动器或路径。

D:\>help replace
替换文件。

REPLACE [drive1:][path1]filename [drive2:][path2] [/A] [/P] [/R] [/W]
REPLACE [drive1:][path1]filename [drive2:][path2] [/P] [/R] [/S] [/W] [/U]

  [drive1:][path1]filename 指定源文件。
  [drive2:][path2]         指定要替换文件的目录。
  /A                       把新文件加入目标目录。不能和/S 或 /U 命令行开关搭配使
用。
  /P                       替换文件或加入源文件之前会先提示您进行确认。
  /R                       替换只读文件以及未受保护的文件。
  /S                       替换目标目录中所有子目录的文件。不能与 /A 命令开关搭
配使用。
  /W                       等您插入磁盘以后再运行。
  /U                       只会替换或更新比源文件日期早的文件。不能与 /A 命令行
开关搭配使用。


D:\>help rmdir
删除一个目录。

RMDIR [/S] [/Q] [drive:]path
RD [/S] [/Q] [drive:]path

    /S      除目录本身外,还将删除指定目录下的所有子目录和
            文件。用于删除目录树。

    /Q      安静模式,带 /S 删除目录树时不要求确认

[ Last edited by zzz19760225 on 2016-2-9 at 06:54 ]



1<词>,2[句],3/段\,4{节},5(章)。
2016-2-9 06:51
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zzz19760225
超级版主




积分 3673
发帖 2020
注册 2016-2-1
状态 离线
『第 23 楼』:  WIN7下CMD帮助文件2(2-2)

D:\>help robocopy

-------------------------------------------------------------------------------
   ROBOCOPY     ::     Windows 的可靠文件复制
-------------------------------------------------------------------------------

  开始时间: Mon Feb 08 22:49:40 2016

               用法 :: ROBOCOPY source destination [file [file]...] [options]

                 源 :: 源目录(驱动器:\路径或\\服务器\共享\路径)。
               目标 :: 目标目录(驱动器:\路径或\\服务器\共享\路径)。
               文件 :: 要复制的文件(名称/通配符: 默认为 "*.*")。

::
:: 复制选项:
::
                 /S :: 复制子目录,但不复制空的子目录。
                 /E :: 复制子目录,包括空的子目录。
             /LEV:n :: 仅复制源目录树的前 n 层。

                 /Z :: 在可重新启动模式下复制文件。
                 /B :: 在备份模式下复制文件。
                /ZB :: 使用可重新启动模式;如果拒绝访问,请使用备份模式。
            /EFSRAW :: 在 EFS RAW 模式下复制所有加密的文件。

      /COPY:复制标记:: 要复制的文件内容(默认为 /COPY:DAT)。
                       (复制标记: D=数据,A=属性,T=时间戳)。
                       (S=安全=NTFS ACL,O=所有者信息,U=审核信息)。

           /DCOPY:T :: 复制目录时间戳。

               /SEC :: 复制具有安全性的文件(等同于 /COPY:DATS)。
           /COPYALL :: 复制所有文件信息(等同于 /COPY:DATSOU)。
            /NOCOPY :: 不复制任何文件信息(与 /PURGE 一起使用生效)。

            /SECFIX :: 修复所有文件的文件安全性,即使是跳过的文件。
            /TIMFIX :: 修复所有文件的文件时间,即使是跳过的文件。

             /PURGE :: 删除源中不再存在的目标文件/目录。
               /MIR :: 镜像目录树(等同于 /E 和 /PURGE)。

               /MOV :: 移动文件(复制后从源中删除)。
              /MOVE :: 移动文件和目录(复制后从源中删除)。

     /A+:[RASHCNET] :: 将给定的属性添加到复制文件。
     /A-:[RASHCNET] :: 从复制文件中删除给定的属性。

            /CREATE :: 仅创建目录树和长度为零的文件。
               /FAT :: 仅使用 8.3 FAT 文件名创建目标文件。
               /256 :: 关闭超长路径(> 256 字符)支持。

             /MON:n :: 监视源;发现多于 n 个更改时再次运行。
             /MOT:m :: 监视源;如果更改,在 m 分钟时间内再次运行。

      /RH:hhmm-hhmm :: 运行小时数 - 可以启动新副本的时间。
                /PF :: 以每个文件(而不是每个步骤)为基础检查运行小时数。

             /IPG:n :: 程序包间的间距(ms),以释放低速线路上的带宽。

                /SL :: 对照目标复制符号链接。

            /MT[:n] :: 使用 n 个线程进行多线程复制(默认值为 8)。
                       n 必须至少为 1,但不得大于 128。
                       该选项与 /IPG 和 /EFSRAW 选项不兼容。
                       使用 /LOG 选项重定向输出以便获得最佳性能。

::
:: 文件选择选项:
::
                 /A :: 仅复制具有存档属性集的文件。
                 /M :: 仅复制具有存档属性的文件并重置存档属性。
    /IA:[RASHCNETO] :: 仅包含具有任意给定属性集的文件。
    /XA:[RASHCNETO] :: 排除具有任意给定属性集的文件。

  /XF 文件[文件]... :: 排除与给定名称/路径/通配符匹配的文件。
  /XD 目录[目录]... :: 排除与给定名称/路径匹配的目录。

                /XC :: 排除已更改的文件。
                /XN :: 排除较新的文件。
                /XO :: 排除较旧的文件。
                /XX :: 排除多余的文件和目录。
                /XL :: 排除孤立的文件和目录。
                /IS :: 包含相同文件。
                /IT :: 包含已调整的文件。

             /MAX:n :: 最大的文件大小 - 排除大于 n 字节的文件。
             /MIN:n :: 最小的文件大小 - 排除小于 n 字节的文件。

          /MAXAGE:n :: 最长的文件存在时间 - 排除早于 n 天/日期的文件。
          /MINAGE:n :: 最短的文件存在时间 - 排除晚于 n 天/日期的文件。
          /MAXLAD:n :: 最大的最后访问日期 - 排除自 n 以来未使用的文件。
          /MINLAD:n :: 最小的最后访问日期 - 排除自 n 以来使用的文件。
                       (If n < 1900 then n = n days, else n = YYYYMMDD date)。

                /XJ :: 排除接合点。(默认情况下通常包括)。

               /FFT :: 假设 FAT 文件时间(2 秒粒度)。
               /DST :: 弥补 1 小时的 DST 时间差。

               /XJD :: 排除目录的接合点。
               /XJF :: 排除文件的接合点。

::
:: 重试选项:
::
               /R:n :: 失败副本的重试次数: 默认为 1 百万。
               /W:n :: 两次重试间的等待时间: 默认为 30 秒。

               /REG :: 将注册表中的 /R:n 和 /W:n 保存为默认设置。

               /TBD :: 等待定义共享名称(重试错误 67)。

::
:: 日志记录选项:
::
                 /L :: 仅列出 - 不复制、添加时间戳或删除任何文件。
                 /X :: 报告所有多余的文件,而不只是选中的文件。
                 /V :: 生成详细输出,同时显示跳过的文件。
                /TS :: 在输出中包含源文件的时间戳。
                /FP :: 在输出中包含文件的完整路径名称。
             /BYTES :: 以字节打印大小。

                /NS :: 无大小 - 不记录文件大小。
                /NC :: 无类别 - 不记录文件类别。
               /NFL :: 无文件列表 - 不记录文件名。
               /NDL :: 无目录列表 - 不记录目录名称。

                /NP :: 无进度 - 不显示已复制的百分比。
               /ETA :: 显示复制文件的预期到达时间。

          /LOG:文件 :: 将状态输出到日志文件(覆盖现有日志)。
         /LOG+:文件 :: 将状态输出到日志文件(附加到现有日志中)。

       /UNILOG:文件 :: 以 UNICODE 方式将状态输出到日志文件(覆盖现有日志)。
      /UNILOG+:文件 :: 以 UNICODE 方式将状态输出到日志文件(附加到现有日志中)。

               /TEE :: 输出到控制台窗口和日志文件。

               /NJH :: 没有作业标头。
               /NJS :: 没有作业摘要。

           /UNICODE :: 以 UNICODE 方式输出状态。

::
:: 作业选项 :
::
      /JOB:作业名称 :: 从命名的作业文件中提取参数。
     /SAVE:作业名称 :: 将参数保存到命名的作业文件
              /QUIT :: 处理命令行后退出(以查看参数)。
              /NOSD :: 未指定源目录。
              /NODD :: 未指定目标目录。
                /IF :: 包含以下文件。


D:\>help set
显示、设置或删除 cmd.exe 环境变量。

SET [variable=[string]]

  variable  指定环境变量名。
  string    指定要指派给变量的一系列字符串。

要显示当前环境变量,键入不带参数的 SET。

如果命令扩展被启用,SET 会如下改变:

可仅用一个变量激活 SET 命令,等号或值不显示所有前缀匹配
SET 命令已使用的名称的所有变量的值。例如:

    SET P

会显示所有以字母 P 打头的变量

如果在当前环境中找不到该变量名称,SET 命令将把 ERRORLEVEL
设置成 1。

SET 命令不允许变量名含有等号。

在 SET 命令中添加了两个新命令行开关:

    SET /A expression
    SET /P variable=[promptString]

/A 命令行开关指定等号右边的字符串为被评估的数字表达式。该表达式
评估器很简单并以递减的优先权顺序支持下列操作:

    ()                  - 分组
    ! ~ -               - 一元运算符
    * / %               - 算数运算符
    + -                 - 算数运算符
    << >>               - 逻辑移位
                       - 按位“与”
    ^                   - 按位“异”
    |                   - 按位“或”
    = *= /= %= += -=    - 赋值
      &= ^= |= <<= >>=
    ,                   - 表达式分隔符

如果您使用任何逻辑或取余操作符, 您需要将表达式字符串用
引号扩起来。在表达式中的任何非数字字符串键作为环境变量
名称,这些环境变量名称的值已在使用前转换成数字。如果指定
了一个环境变量名称,但未在当前环境中定义,那么值将被定为
零。这使您可以使用环境变量值做计算而不用键入那些 % 符号
来得到它们的值。如果 SET /A 在命令脚本外的命令行执行的,
那么它显示该表达式的最后值。该分配的操作符在分配的操作符
左边需要一个环境变量名称。除十六进制有 0x 前缀,八进制
有 0 前缀的,数字值为十进位数字。因此,0x12 与 18 和 022
相同。请注意八进制公式可能很容易搞混: 08 和 09 是无效的数字,
因为 8 和 9 不是有效的八进制位数。(& )

/P 命令行开关允许将变量数值设成用户输入的一行输入。读取输入
行之前,显示指定的 promptString。promptString 可以是空的。

环境变量替换已如下增强:

    %PATH:str1=str2%

会扩展 PATH 环境变量,用 "str2" 代替扩展结果中的每个 "str1"。
要有效地从扩展结果中删除所有的 "str1","str2" 可以是空的。
"str1" 可以以星号打头;在这种情况下,"str1" 会从扩展结果的
开始到 str1 剩余部分第一次出现的地方,都一直保持相配。

也可以为扩展名指定子字符串。

    %PATH:~10,5%

会扩展 PATH 环境变量,然后只使用在扩展结果中从第 11 个(偏
移量 10)字符开始的五个字符。如果没有指定长度,则采用默认
值,即变量数值的余数。如果两个数字(偏移量和长度)都是负数,
使用的数字则是环境变量数值长度加上指定的偏移量或长度。

    %PATH:~-10%

会提取 PATH 变量的最后十个字符。

    %PATH:~0,-2%

会提取 PATH 变量的所有字符,除了最后两个。

终于添加了延迟环境变量扩充的支持。该支持总是按默认值被
停用,但也可以通过 CMD.EXE 的 /V 命令行开关而被启用/停用。
请参阅 CMD /?

考虑到读取一行文本时所遇到的目前扩充的限制时,延迟环境
变量扩充是很有用的,而不是执行的时候。以下例子说明直接
变量扩充的问题:

    set VAR=before
    if "%VAR%" == "before" (
        set VAR=after
        if "%VAR%" == "after" @echo If you see this, it worked
    )

不会显示消息,因为在读到第一个 IF 语句时,BOTH IF 语句中
的 %VAR% 会被代替;原因是: 它包含 IF 的文体,IF 是一个
复合语句。所以,复合语句中的 IF 实际上是在比较 "before" 和
"after",这两者永远不会相等。同样,以下这个例子也不会达到
预期效果:

    set LIST=
    for %i in (*) do set LIST=%LIST% %i
    echo %LIST%

原因是,它不会在目前的目录中建立一个文件列表,而只是将
LIST 变量设成找到的最后一个文件。这也是因为 %LIST% 在
FOR 语句被读取时,只被扩充了一次;而且,那时的 LIST 变量
是空的。因此,我们真正执行的 FOR 循环是:

    for %i in (*) do set LIST= %i

这个循环继续将 LIST 设成找到的最后一个文件。

延迟环境变量扩充允许您使用一个不同的字符(惊叹号)在执行
时间扩充环境变量。如果延迟的变量扩充被启用,可以将上面
例子写成以下所示,以达到预期效果:

    set VAR=before
    if "%VAR%" == "before" (
        set VAR=after
        if "!VAR!" == "after" @echo If you see this, it worked
    )

    set LIST=
    for %i in (*) do set LIST=!LIST! %i
    echo %LIST%

如果命令扩展被启用,有几个动态环境变量可以被扩展,但不会出现在 SET 显示的变
量列表中。每次变量数值被扩展时,这些变量数值都会被动态计算。如果用户用这些
名称中任何一个明确定义变量,那个定义会替代下面描述的动态定义:

%CD% - 扩展到当前目录字符串。

%DATE% - 用跟 DATE 命令同样的格式扩展到当前日期。

%TIME% - 用跟 TIME 命令同样的格式扩展到当前时间。

%RANDOM% - 扩展到 0 和 32767 之间的任意十进制数字。

%ERRORLEVEL% - 扩展到当前 ERRORLEVEL 数值。

%CMDEXTVERSION% - 扩展到当前命令处理器扩展版本号。

%CMDCMDLINE% - 扩展到调用命令处理器的原始命令行。

%HIGHESTNUMANODENUMBER% - 扩展到此计算机上的最高 NUMA 节点号。

D:\>help setlocal
开始批处理文件中环境改动的本地化操作。在执行 SETLOCAL 之后
所做的环境改动只限于批处理文件。要还原原先的设置,必须执
行 ENDLOCAL。达到批处理文件结尾时,对于该批处理文件的每个
尚未执行的 SETLOCAL 命令,都会有一个隐含的 ENDLOCAL 被执行。

SETLOCAL

如果命令扩展被启用,SETLOCAL 会如下改变:

SETLOCAL 批命令现在可以接受可选参数:
        ENABLEEXTENSIONS / DISABLEEXTENSIONS
            启用或禁用命令处理器扩展。这些
            参数比 CMD /E:ON 或 /E:OFF
            开关有优先权。请参阅 CMD /? 获取详细信息。
        ENABLEDELAYEDEXPANSION / DISABLEDELAYEDEXPANSION
            启用或禁用延缓环境变量
            扩展。这些参数比 CMD
            /V:ON 或 /V:OFF 开关有优先权。请参阅 CMD /? 获取详细信息。
无论在 SETLOCAL 命令之前它们的设置是什么,这些修改会一直
保留到匹配的 ENDLOCAL 命令。

如果有一个参数,
SETLOCAL 命令将设置 ERRORLEVEL 的值。如果有两个有效参数中的一个,
该值则为零。
用下列技巧,您可以在批脚本中
使用这个来决定扩展是否可用:

    VERIFY OTHER 2>nul
    SETLOCAL ENABLEEXTENSIONS
    IF ERRORLEVEL 1 echo Unable to enable extensions

这个方法之所以有效,是因为在 CMD.EXE 的旧版本上,SETLOCAL
未设置 ERRORLEVEL 值。具有不正确参数的 VERIFY 命令将
ERRORLEVEL 值初始化成非零值。


D:\>help sc

错误:  未知命令

描述:
        SC 是用于与服务控制管理器和服务进行通信的命令行程序。
用法:
        sc <server> [command] [service name] <option1> <option2>...


        选项 <server> 的格式为 "\\ServerName"
        键入 "sc [command]" 可以获得有关命令的进一步帮助
        命令:
          query-----------查询服务的状态,
                          或枚举服务类型的状态。
          queryex---------查询服务的扩展状态,
                          或枚举服务类型的状态。
          start-----------启动服务。
          pause-----------向服务发送 PAUSE 控制请求。
          interrogate-----向服务发送 INTERROGATE 控制请求。
          continue--------向服务发送 CONTINUE 控制请求。
          stop------------向服务发送 STOP 请求。
          config----------更改服务的配置(永久)。
          description-----更改服务的描述。
          failure---------更改服务失败时执行的操作。
          failureflag-----更改服务的失败操作标志。
          sidtype---------更改服务的服务 SID 类型。
          privs-----------更改服务的所需权限。
          qc--------------查询服务的配置信息。
          qdescription----查询服务的描述。
          qfailure--------查询失败时服务执行的操作。
          qfailureflag----查询服务的失败操作标志。
          qsidtype--------查询服务的服务 SID 类型。
          qprivs----------查询服务的所需权限。
          qtriggerinfo----查询服务的触发器参数。
          qpreferrednode--查询首选的服务 NUMA 节点。
          delete----------(从注册表)删除服务。
          create----------创建服务(将其添加到注册表)。
          control---------向服务发送控制。
          sdshow----------显示服务的安全描述符。
          sdset-----------设置服务的安全描述符。
          showsid---------显示相应于假定名称的 SID 字符串。
          triggerinfo-----配置服务的触发器参数。
          preferrednode---设置首选的服务 NUMA 节点。
          GetDisplayName--获取服务的 DisplayName
          GetKeyName------获取服务的 ServiceKeyName。
          EnumDepend------枚举服务的依存关系。

        下列命令不要求服务名称:
        sc <server> <command> <option>
          boot------------(ok | bad) 指示是否将上一次启动保存为
                          最近一次已知的正确启动配置
          Lock------------锁定服务数据库
          QueryLock-------查询 SCManager 数据库的 LockStatus
示例:
        sc start MyService

是否想参阅 QUERY 和 QUERYEX 命令的帮助? [ y | n ]:
y

QUERY 和 QUERYEX 选项:
        如果查询命令带服务名称,将返回
        该服务的状态。其他选项不适合这种
        情况。如果查询命令不带参数或
        带下列选项之一,将枚举此服务。
    type=    要枚举的服务的类型(driver, service, all)
             默认 = service)
    state=   要枚举的服务的状态 (inactive, all)
             (默认 = active)
    bufsize= 枚举缓冲区的大小(以字节计)
             (默认 = 4096)
    ri=      开始枚举的恢复索引号
             (默认 = 0)
    group=   要枚举的服务组
             (默认 = all groups)

语法示例
sc query                - 枚举活动服务和驱动程序的状态
sc query eventlog       - 显示 eventlog 服务的状态
sc queryex eventlog     - 显示 eventlog 服务的扩展状态
sc query type= driver   - 仅枚举活动驱动程序
sc query type= service  - 仅枚举 Win32 服务
sc query state= all     - 枚举所有服务和驱动程序
sc query bufsize= 50    - 枚举缓冲区为 50 字节
sc query ri= 14         - 枚举时恢复索引 = 14
sc queryex group= ""    - 枚举不在组内的活动服务
sc query type= interact - 枚举所有不活动服务
sc query type= driver group= NDIS     - 枚举所有 NDIS 驱动程序


D:\>help schtasks

SCHTASKS /parameter [arguments]

描述:
    允许管理员创建、删除、查询、更改、运行和中止本地或远程系统上的计划任
    务。

参数列表:
    /Create         创建新计划任务。

    /Delete         删除计划任务。

    /Query          显示所有计划任务。

    /Change         更改计划任务属性。

    /Run            按需运行计划任务。

    /End            中止当前正在运行的计划任务。

    /ShowSid        显示与计划的任务名称相应的安全标识符。

    /?              显示此帮助消息。

Examples:
    SCHTASKS
    SCHTASKS /?
    SCHTASKS /Run /?
    SCHTASKS /End /?
    SCHTASKS /Create /?
    SCHTASKS /Delete /?
    SCHTASKS /Query  /?
    SCHTASKS /Change /?
    SCHTASKS /ShowSid /?


D:\>help shift
更改批处理文件中可替换参数的位置。

SHIFT [/n]

如果命令扩展被启用,SHIFT 命令支持/n 命令行开关;该命令行开关告诉
命令从第 n 个参数开始移位;n 介于零和八之间。例如:

    SHIFT /2

会将 %3 移位到 %2,将 %4 移位到 %3,等等;并且不影响 %0 和 %1。

D:\>help shutdown
用法: shutdown [/i | /l | /s | /r | /g | /a | /p | /h | /e] [/f]
    [/m \\computer][/t xxx][/d [p|u:]xx:yy [/c "comment"]]

    没有参数   显示帮助。这与键入 /? 是一样的。
    /?         显示帮助。这与不键入任何选项是一样的。
    /i         显示图形用户界面(GUI)。
               这必须是第一个选项。
    /l         注销。这不能与 /m 或 /d 选项一起使用。
    /s         关闭计算机。
    /r         关闭并重新启动计算机。
    /g         关闭并重新启动计算机。系统重新启动后,
               重新启动所有注册的应用程序。
    /a         中止系统关闭。
               这只能在超时期间使用。
    /p         关闭本地计算机,没有超时或警告。
               可以与 /d 和 /f 选项一起使用。
    /h         休眠本地计算机。
               可以与 /f 选项一起使用。
    /e         记录计算机意外关闭的原因。
    /m \\computer 指定目标计算机。
    /t xxx     设置关闭前的超时为 xxx 秒。
               有效范围是 0-315360000 (10 年),默认值为 30。
               如果超时时间大于 0,则默示 /f
               参数。
    /c "comment" 重启动或关闭的原因的注释。
               最多允许 512 个字符。
    /f         强制正在运行的应用程序关闭,不前台警告用户。
               当为 /t 参数指定大于 0 的值时,
               则默示 /f 参数。
    /d [p|u:]xx:yy  提供重新启动或关机的原因。
               p 表明重新启动或关闭是计划内的。
               u 表示原因由用户定义。
               如果 p 和 u 均未指定,则是计划外重新启动
               或关闭。
               xx 是主要原因号(小于 256 的正整数)。
               yy 是次要原因号(小于 65536 的正整数)。

此计算机上的原因:
(E = 预期 U = 意外 P = 计划内,C = 自定义)
类别    主要    次要    标题

U      0       0       其他(计划外)
E       0       0       其他(计划外)
E P     0       0       其他(计划内)
U      0       5       其他故障: 系统没有反应
E       1       1       硬件: 维护(计划外)
E P     1       1       硬件: 维护(计划内)
E       1       2       硬件: 安装(计划外)
E P     1       2       硬件: 安装(计划内)
E       2       2       操作系统: 恢复(计划内)
E P     2       2       操作系统: 恢复(计划内)
  P     2       3       操作系统: 升级(计划内)
E       2       4       操作系统: 重新配置(计划外)
E P     2       4       操作系统: 重新配置(计划内)
  P     2       16      操作系统: Service Pack (计划内)
        2       17      操作系统: 热修补(计划外)
  P     2       17      操作系统: 热修补(计划内)
        2       18      操作系统: 安全修补(计划外)
  P     2       18      操作系统: 安全修补(计划内)
E       4       1       应用程序: 维护(计划外)
E P     4       1       应用程序: 维护(计划内)
E P     4       2       应用程序: 安装(计划内)
E       4       5       应用程序: 没有反应
E       4       6       应用程序: 不稳定
U      5       15      系统故障: 停止错误
U      5       19      安全问题
E       5       19      安全问题
E P     5       19      安全问题
E       5       20      网络连接丢失(计划外)
U      6       11      电源故障: 电线被拔掉
U      6       12      电源故障: 环境
  P     7       0       旧版 API 关机

D:\>help sort
SORT [/R] [/+n] [/M kilobytes] [/L locale] [/REC recordbytes]
  [[drive1:][path1]filename1] [/T [drive2:][path2]]
  [/O [drive3:][path3]filename3]
  /+n                         指定开始每个比较的字符号码 n。/+3 说明每个
                              比较应从每行的第三个字符开始。少于 n 个字符
                              的行排在其他行之前。按默认值,从每行的第一
                              个字符开始比较。
  /L[OCALE] locale            用指定的区域设置替代系统默认区域设置。
                              ""C"" 区域设置产生最快的排序顺序并且是当前
                              的唯一其他选择。排序总是不分大小写的。
  /M[EMORY] kilobytes         指定用于排序的主内存量,单位为 KB。
                              最小内存量总是 160 KB。如果指定内存大小,
                              无论主内存的可用量是多少,指定的内存量会
                              全部用于排序。

                              要取得最佳性能,通常不指定内存大小。按默认
                              值,如果达到默认最大内存值,排序会一次完成
                              (非临时文件);否则,排序会分两次完成(没有
                              完全排序的数据存储在临时文件中);用于排序
                              和合并的内存量相等。如果输入和输出都是文
                              件,默认最大内存量为可用主内存的 90%;
                              否则,为主内存的 45%。
  /REC[ORD_MAXIMUM] characters 指定记录中的最大字符数量
                              (默认值为 4096,最大值为 65535)。
  /R[EVERSE]                  颠倒排序顺序,即,从 Z 到 A,再从 9 到 0。
  [drive1:][path1]filename1   指定要排序的文件。如果没有指定,则排序标准
                              输入。指定输入文件比将同一个文件重定向为标
                              准输入快。
  /T[EMPORARY]
    [drive2:][path2]          指定保留排序工作存储的目录路径,以防主内
                              存无法容纳数据。默认值是使用系统临时目录。
  /O[UTPUT]
    [drive3:][path3]filename3 指定在哪个文件中储存经过排序的输入。
                              如果没有指定,数据会被写入标准输出。指定
                              输出文件比将标准输出重定向到同一个文件快。


D:\>help start
启动一个单独的窗口运行指定的程序或命令。

START ["title"] [/D path] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED]
      [/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL]
      [/NODE <NUMA node>] [/AFFINITY <hex affinity mask>] [/WAIT] [/B]
      [command/program] [parameters]

    "title"     在窗口标题栏中显示的标题。
    path        启动目录。
    B           启动应用程序,但不创建新窗口。应用程序已忽略 ^C 处理。
                除非应用程序启用 ^C 处理,否则 ^Break 是唯一可以中断
                该应用程序的方式。
    I           新的环境将是传递给 cmd.exe 的原始环境,而不是当前环境。

    MIN         以最小化方式启动窗口。
    MAX         以最大化方式启动窗口。
    SEPARATE    在单独的内存空间中启动 16 位 Windows 程序。
    SHARED      在共享内存空间中启动 16 位 Windows 程序。
    LOW         在 IDLE 优先级类中启动应用程序。
    NORMAL      在 NORMAL 优先级类中启动应用程序。
    HIGH        在 HIGH 优先级类中启动应用程序。
    REALTIME    在 REALTIME 优先级类中启动应用程序。
    ABOVENORMAL 在 ABOVENORMAL 优先级类中启动应用程序。
    BELOWNORMAL 在 BELOWNORMAL 优先级类中启动应用程序。
    NODE        将首选非一致性内存结构 (NUMA) 节点指定为十进制整数。
    AFFINITY    将处理器关联掩码指定为十六进制数字。进程被限制在这些
                处理器上运行。

                当 /AFFINITY 和 /NODE 结合时,会对关联掩码进行不同的解释。
                指定关联掩码,正如 NUMA 节点的处理器掩码正确移动到零位
                起始位置一样。进程被限制在指定关联掩码和 NUMA 节点之间的
                那些通用处理器上运行。如果没有通用处理器,则进程被限制在
                指定的 NUMA 节点上运行。
    WAIT        启动应用程序并等待它终止。
    command/program
                如果它是内部 cmd 命令或批文件,则该命令处理器是使用
                cmd.exe 的 /K 开关运行的。这表示运行该命令之后,该窗口
                将仍然存在。

                如果它不是内部 cmd 命令或批文件,则它就是一个程序,并将
                作为一个窗口化应用程序或控制台应用程序运行。

    parameters  这些是传递给 command/program 的参数。

注意: 在 64 位平台上不支持 SEPARATE 和 SHARED 选项。

通过指定 /NODE,可按照利用 NUMA 系统中的内存区域的方式创建进程。例如,
可以创建两个完全通过共享内存互相通信的进程以共享相同的首选 NUMA 节点,
从而最大限度地减少内存延迟。如有可能,它们即会分配来自相同 NUMA 节点的
内存,并且会在指定节点之外的处理器上自由运行。

    启动 /NODE 1 application1.exe
    启动 /NODE 1 application2.exe

这两个进程可被进一步限制在相同 NUMA 节点内的指定处理器上运行。在以下
示例中, application1 在节点的两个低顺序处理器上运行,而 application2
在该节点的其后两个处理器上运行。该示例假定指定节点至少具有四个逻辑
处理器。请注意,节点号可更改为该计算机的任何有效节点号,而无需更改关联
掩码。

    启动 /NODE 1 /AFFINITY 0x3 application1.exe
    启动 /NODE 1 /AFFINITY 0xc application2.exe

如果命令扩展被启用,通过命令行或 START 命令的外部命令
调用会如下改变:

将文件名作为命令键入,非可执行文件可以通过文件关联调用。
    (例如,WORD.DOC 会调用跟 .DOC 文件扩展名关联的应用程序)。
    关于如何从命令脚本内部创建这些关联,请参阅 ASSOC 和
     FTYPE 命令。

执行的应用程序是 32-位 GUI 应用程序时,CMD.EXE 不等应用
    程序终止就返回命令提示符。如果在命令脚本内执行,该新行为
    则不会发生。

如果执行的命令行的第一个符号是不带扩展名或路径修饰符的
    字符串 "CMD","CMD" 会被 COMSPEC 变量的数值所替换。这
    防止从当前目录提取 CMD.EXE。

如果执行的命令行的第一个符号没有扩展名,CMD.EXE 会使用
    PATHEXT 环境变量的数值来决定要以什么顺序寻找哪些扩展
    名。PATHEXT 变量的默认值是:

        .COM;.EXE;.BAT;.CMD

    请注意,该语法跟 PATH 变量的一样,分号隔开不同的元素。

查找可执行文件时,如果没有相配的扩展名,看一看该名称是否
与目录名相配。如果确实如此,START 会在那个路径上调用
Explorer。如果从命令行执行,则等同于对那个路径作 CD /D。


D:\>help subst
将路径与驱动器号关联。

SUBST [drive1: [drive2:]path]
SUBST drive1: /D

  drive1:        指定要分配路径的虚拟驱动器。
  [drive2:]path  指定物理驱动器和要分配给虚拟驱动器的路径。
  /D             删除被替换的
(虚拟)驱动器。

不带参数键入 SUBST,以显示当前虚拟驱动器的列表。

D:\>help systeminfo

SYSTEMINFO [/S system [/U username [/P [password]]]] [/FO format] [/NH]

描述:
    该工具显示本地或远程机器(包括服务包级别)的操作系统配置的信息。

参数列表:
    /S      system           指定要连接的远程系统。

    /U      [domain\]user    指定应该在哪个用户上下文执行命令。


    /P      [password]       指定给定用户上下文的密码。如果省略则
                             提示输入。

    /FO     format           指定显示结果的格式。
                             有效值: "TABLE"、"LIST"、"CSV"。

    /NH                      指定“列标题”不应该在输出中显示。
                             只对 "TABLE" 和 "CSV" 格式有效。

    /?                       显示帮助消息。


例如:
    SYSTEMINFO
    SYSTEMINFO /?
    SYSTEMINFO /S system
    SYSTEMINFO /S system /U user
    SYSTEMINFO /S system /U domain\user /P password /FO TABLE
    SYSTEMINFO /S system /FO LIST
    SYSTEMINFO /S system /FO CSV /NH

D:\>help tasklist

TASKLIST [/S system [/U username [/P [password]]]]
         [/M [module] | /SVC | /V] [/FI filter] [/FO format] [/NH]

描述:
    该工具显示在本地或远程机器上当前运行的进程列表。

参数列表:
   /S     system           指定连接到的远程系统。

   /U     [domain\]user    指定应该在哪个用户上下文执行这个命令。

   /P     [password]       为提供的用户上下文指定密码。如果省略,则
                           提示输入。

   /M     [module]         列出当前使用所给 exe/dll 名称的所有任务。
                           如果没有指定模块名称,显示所有加载的模块。

   /SVC                    显示每个进程中主持的服务。

   /V                      显示详述任务信息。

   /FI    filter           显示一系列符合筛选器指定的标准的任务。

   /FO    format           指定输出格式。
                           有效值: "TABLE"、"LIST"、"CSV"。

   /NH                     指定列标题不应该在输出中显示。
                           只对 "TABLE" 和 "CSV" 格式有效。

   /?                      显示帮助消息。


筛选器:
    筛选器名        有效操作符                有效值
    -----------     ---------------           --------------------------
    STATUS          eq, ne                    RUNNING |
                                              NOT RESPONDING | UNKNOWN
    IMAGENAME       eq, ne                    映像名称
    PID             eq, ne, gt, lt, ge, le    PID 值
    SESSION         eq, ne, gt, lt, ge, le    会话编号
    SESSIONNAME     eq, ne                    会话名
    CPUTIME         eq, ne, gt, lt, ge, le    CPU 时间,格式为
                                              hh:mm:ss。
                                              hh - 时,
                                              mm - 分,ss - 秒
    MEMUSAGE        eq, ne, gt, lt, ge, le    内存使用量,单位为 KB
    USERNAME        eq, ne                    用户名,格式为 [domain\]user
    SERVICES        eq, ne                    服务名称
    WINDOWTITLE     eq, ne                    窗口标题
    MODULES         eq, ne                    DLL 名称

说明: 当查询远程机器时,不支持 "WINDOWTITLE" 和 "STATUS"
      筛选器。

示例:
    TASKLIST
    TASKLIST /M
    TASKLIST /V /FO CSV
    TASKLIST /SVC /FO LIST
    TASKLIST /M wbem*
    TASKLIST /S system /FO LIST
    TASKLIST /S system /U domain\username /FO CSV /NH
    TASKLIST /S system /U username /P password /FO TABLE /NH
    TASKLIST /FI "USERNAME ne NT AUTHORITY\SYSTEM" /FI "STATUS eq running"

D:\>help taskkill

TASKKILL [/S system [/U username [/P [password]]]]
         { [/FI filter] [/PID processid | /IM imagename] } [/T] [/F]

描述:
    使用该工具按照进程 ID (PID) 或映像名称终止任务。

参数列表:
    /S    system           指定要连接的远程系统。

    /U    [domain\]user    指定应该在哪个用户上下文执行这个命令。

    /P    [password]       为提供的用户上下文指定密码。如果忽略,提示
                           输入。

    /FI   filter           应用筛选器以选择一组任务。
                           允许使用 "*"。例如,映像名称 eq acme*

    /PID  processid        指定要终止的进程的 PID。
                           使用 TaskList 取得 PID。

    /IM   imagename        指定要终止的进程的映像名称。通配符 '*'可用来
                           指定所有任务或映像名称。

    /T                     终止指定的进程和由它启用的子进程。

    /F                     指定强制终止进程。

    /?                     显示帮助消息。

筛选器:
    筛选器名      有效运算符                有效值
    -----------   ---------------           -------------------------
    STATUS        eq, ne                    RUNNING |
                                            NOT RESPONDING | UNKNOWN
    IMAGENAME     eq, ne                    映像名称
    PID           eq, ne, gt, lt, ge, le    PID 值
    SESSION       eq, ne, gt, lt, ge, le    会话编号。
    CPUTIME       eq, ne, gt, lt, ge, le    CPU 时间,格式为
                                            hh:mm:ss。
                                            hh - 时,
                                            mm - 分,ss - 秒
    MEMUSAGE      eq, ne, gt, lt, ge, le    内存使用量,单位为 KB
    USERNAME      eq, ne                    用户名,格式为 [domain\]user
    MODULES       eq, ne                    DLL 名称
    SERVICES      eq, ne                    服务名称
    WINDOWTITLE   eq, ne                    窗口标题

    说明
    ----
    1) 只有在应用筛选器的情况下,/IM 切换才能使用通配符 '*'。
    2) 远程进程总是要强行 (/F) 终止。
    3) 当指定远程机器时,不支持 "WINDOWTITLE" 和 "STATUS" 筛选器。

例如:
    TASKKILL /IM notepad.exe
    TASKKILL /PID 1230 /PID 1241 /PID 1253 /T
    TASKKILL /F /IM cmd.exe /T
    TASKKILL /F /FI "PID ge 1000" /FI "WINDOWTITLE ne untitle*"
    TASKKILL /F /FI "USERNAME eq NT AUTHORITY\SYSTEM" /IM notepad.exe
    TASKKILL /S system /U domain\username /FI "USERNAME ne NT*" /IM *
    TASKKILL /S system /U username /P password /FI "IMAGENAME eq note*"


D:\>help time
显示或设置系统时间。

TIME [/T | time]

显示当前时间设置和输入新时间的提示,请键入
不带参数的 TIME。要保留现有时间,请按 Enter。

如果命令扩展被启用,TIME 命令会支持 /T 命令行开关;该命令行开关告诉
命令只输出当前时间,但不提示输入新时间。

D:\>help title
设置命令提示窗口的窗口标题。

TITLE [string]

  string       指定命令提示窗口的标题。

D:\>help tree
以图形显示驱动器或路径的文件夹结构。

TREE [drive:][path] [/F] [/A]

   /F   显示每个文件夹中文件的名称。
   /A   使用 ASCII 字符,而不使用扩展字符。


D:\>help type
显示文本文件的内容。

TYPE [drive:][path]filename

D:\>help ver
显示 Windows 版本。

VER

D:\>help verify
指示 cmd.exe 是否要验证文件是否已正确地写入磁盘。

VERIFY [ON | OFF]

要显示当前 VERIFY 设置,键入不带参数的 VERIFY。

D:\>help vol
显示磁盘卷标和序列号(如果存在)。

VOL [drive:]

D:\>help xcopy
复制文件和目录树。

XCOPY source [destination] [/A | /M] [/D[:date]] [/P] [/S [/E]] [/V] [/W]
                           [/C] [/I] [/Q] [/F] [/L] [/G] [/H] [/R] [/T] [/U]
                           [/K] [/N] [/O] [/X] [/Y] [/-Y] [/Z] [/B]
                           [/EXCLUDE:file1[+file2][+file3]...]

  source       指定要复制的文件。
  destination  指定新文件的位置和/或名称。
  /A           仅复制有存档属性集的文件,但不更改属性。
  /M           仅复制有存档属性集的文件,并关闭存档属性。
  /D:m-d-y     复制在指定日期或指定日期以后更改的文件。
               如果没有提供日期,只复制那些源时间比目标时间新的文件。
  /EXCLUDE:file1[+file2][+file3]...
               指定含有字符串的文件列表。每个字符串在文件中应位于单独的一行。
               如果任何字符串与复制文件的绝对路径的任何部分相符,则排除复制
               该文件。例如,指定如 \obj\ 或 .obj 的字符串会分别排除目录
               obj 下面的所有文件或带有 .obj 扩展名的所有文件。
  /P           创建每个目标文件之前提示您。
  /S           复制目录和子目录,不包括空目录。
  /E           复制目录和子目录,包括空目录。与 /S /E 相同。可以用来修改 /T。
  /V           验证每个新文件的大小。
  /W           提示您在复制前按键。
  /C           即使有错误,也继续复制。
  /I           如果目标不存在,且要复制多个文件,则假定目标必须是目录。
  /Q           复制时不显示文件名。
  /F           复制时显示完整的源文件名和目标文件名。
  /L           显示要复制的文件。
  /G           允许将加密文件复制到不支持加密的目标。
  /H           也复制隐藏文件和系统文件。
  /R           覆盖只读文件。
  /T           创建目录结构,但不复制文件。不包括空目录或子目录。/T /E 包括
               空目录和子目录。
  /U           只复制已经存在于目标中的文件。
  /K           复制属性。一般的 Xcopy 会重设只读属性。
  /N           用生成的短名称复制。
  /O           复制文件所有权和 ACL 信息。
  /X           复制文件审核设置(隐含 /O)。
  /Y           取消提示以确认要覆盖现有目标文件。
  /-Y          要提示以确认要覆盖现有目标文件。
  /Z           在可重新启动模式下复制网络文件。
  /B           复制符号链接本身与链接目标相对。
  /J           复制时不使用缓冲的 I/O。推荐复制大文件时使用。

开关 /Y 可以预先在 COPYCMD 环境变量中设置。
这可能被命令行上的 /-Y 覆盖。


D:\>help wmic

[global switches] <command>

The following global switches are available:
/NAMESPACE           Path for the namespace the alias operate against.
/ROLE                Path for the role containing the alias definitions.
/NODE                Servers the alias will operate against.
/IMPLEVEL            Client impersonation level.
/AUTHLEVEL           Client authentication level.
/LOCALE              Language id the client should use.
/PRIVILEGES          Enable or disable all privileges.
/TRACE               Outputs debugging information to stderr.
/RECORD              Logs all input commands and output.
/INTERACTIVE         Sets or resets the interactive mode.
/FAILFAST            Sets or resets the FailFast mode.
/USER                User to be used during the session.
/PASSWORD            Password to be used for session login.
/OUTPUT              Specifies the mode for output redirection.
/APPEND              Specifies the mode for output redirection.
/AGGREGATE           Sets or resets aggregate mode.
/AUTHORITY           Specifies the <authority type> for the connection.
/?[:<BRIEF|FULL>]    Usage information.

For more information on a specific global switch, type: switch-name /?


The following alias/es are available in the current role:
ALIAS                    - Access to the aliases available on the local system
BASEBOARD                - Base board (also known as a motherboard or system boa
rd) management.
BIOS                     - Basic input/output services (BIOS) management.
BOOTCONFIG               - Boot configuration management.
CDROM                    - CD-ROM management.
COMPUTERSYSTEM           - Computer system management.
CPU                      - CPU management.
CSPRODUCT                - Computer system product information from SMBIOS.
DATAFILE                 - DataFile Management.
DCOMAPP                  - DCOM Application management.
DESKTOP                  - User's Desktop management.
DESKTOPMONITOR           - Desktop Monitor management.
DEVICEMEMORYADDRESS      - Device memory addresses management.
DISKDRIVE                - Physical disk drive management.
DISKQUOTA                - Disk space usage for NTFS volumes.
DMACHANNEL               - Direct memory access (DMA) channel management.
ENVIRONMENT              - System environment settings management.
FSDIR                    - Filesystem directory entry management.
GROUP                    - Group account management.
IDECONTROLLER            - IDE Controller management.
IRQ                      - Interrupt request line (IRQ) management.
JOB                      - Provides  access to the jobs scheduled using the sche
dule service.
LOADORDER                - Management of system services that define execution d
ependencies.
LOGICALDISK              - Local storage device management.
LOGON                    - LOGON Sessions.
MEMCACHE                 - Cache memory management.
MEMORYCHIP               - Memory chip information.
MEMPHYSICAL              - Computer system's physical memory management.
NETCLIENT                - Network Client management.
NETLOGIN                 - Network login information (of a particular user) mana
gement.
NETPROTOCOL              - Protocols (and their network characteristics) managem
ent.
NETUSE                   - Active network connection management.
NIC                      - Network Interface Controller (NIC) management.
NICCONFIG                - Network adapter management.
NTDOMAIN                 - NT Domain management.
NTEVENT                  - Entries in the NT Event Log.
NTEVENTLOG               - NT eventlog file management.
ONBOARDDEVICE            - Management of common adapter devices built into the m
otherboard (system board).
OS                       - Installed Operating System/s management.
PAGEFILE                 - Virtual memory file swapping management.
PAGEFILESET              - Page file settings management.
PARTITION                - Management of partitioned areas of a physical disk.
PORT                     - I/O port management.
PORTCONNECTOR            - Physical connection ports management.
PRINTER                  - Printer device management.
PRINTERCONFIG            - Printer device configuration management.
PRINTJOB                 - Print job management.
PROCESS                  - Process management.



1<词>,2[句],3/段\,4{节},5(章)。
2016-2-9 06:53
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zzz19760225
超级版主




积分 3673
发帖 2020
注册 2016-2-1
状态 离线
『第 24 楼』:  深度2015系统下深度终端的命令帮助

zzz19760225@zzz19760225-pc:~$ help
GNU bash,版本 4.3.42(1)-release (x86_64-pc-linux-gnu)
这些 shell 命令是内部定义的。请输入 `help' 以获取一个列表。
输入 `help 名称' 以得到有关函数`名称'的更多信息。
使用 `info bash' 来获得关于 shell 的更多一般性信息。
使用 `man -k' 或 `info' 来获取不在列表中的命令的更多信息。

名称旁边的星号(*)表示该命令被禁用。

job_spec [&]                                history [-c] [-d 偏移量] [n] 或 history -anr>
(( 表达式 ))                                   if 命令; then 命令; [ elif 命令; then 命令; ]...>
. 文件名 [参数]                                  jobs [-lnprs] [任务声明 ...] 或 jobs -x 命令 [参>
:                                           kill [-s 信号声明 | -n 信号编号 | -信号声明] 进程号 | 任>
[ 参数... ]                                   let 参数 [参数 ...]
[[ 表达式 ]]                                   local [option] 名称[=值] ...
alias [-p] [名称[=值] ... ]                    logout [n]
bg [任务声明 ...]                               mapfile [-n 计数] [-O 起始序号] [-s 计数] [-t] [>
bind [-lpsvPSVX] [-m keymap] [-f filename>  popd [-n] [+N | -N]
break [n]                                   printf [-v var] 格式 [参数]
builtin [shell 内建 [参数 ...]]                 pushd [-n] [+N | -N | 目录]
caller [表达式]                                pwd [-LP]
case 词 in [模式 [| 模式]...) 命令 ;;]... esac         read [-ers] [-a 数组] [-d 分隔符] [-i 缓冲区文字] >
cd [-L|[-P [-e]] [-@]] [dir]                readarray [-n 计数] [-O 起始序号] [-s 计数] [-t]>
command [-pVv] 命令 [参数 ...]                  readonly [-aAf] [名称[=值] ...] 或 readonly >
compgen [-abcdefgjksuv] [-o 选项]  [-A 动作] >      return [n]
complete [-abcdefgjksuv] [-pr] [-DE] [-o >   select NAME [in 词语 ... ;] do 命令; done
compopt [-o|+o 选项] [-DE] [名称 ...]           set [--abefhkmnptuvxBCHP] [-o 选项名] [--] >
continue [n]                                shift [n]
coproc [名称] 命令 [重定向]                        shopt [-pqsu] [-o] [选项名 ...]
declare [-aAfFgilnrtux] [-p] [name[=value>  source 文件名 [参数]
dirs [-clpv] [+N] [-N]                      suspend [-f]
disown [-h] [-ar] [任务声明 ...]                test [表达式]
echo [-neE] [参数 ...]                        time [-p] 管道
enable [-a] [-dnps] [-f 文件名] [名称 ...]       times
eval [参数 ...]                               trap [-lp] [[参数] 信号声明 ...]
exec [-cl] [-a 名称] [命令 [参数 ...]] [重定向 ...>         true
exit [n]                                    type [-afptP] 名称 [名称 ...]
export [-fn] [名称[=值] ...] 或 export -p       typeset [-aAfFgilrtux] [-p] 名称[=值] ...
false                                       ulimit [-SHabcdefilmnpqrstuvxT] [limit]
fc [-e 编辑器名] [-lnr] [起始] [终结] 或 fc -s [模式>           umask [-p] [-S] [模式]
fg [任务声明]                                   unalias [-a] 名称 [名称 ...]
for 名称 [in 词语 ... ] ; do 命令; done           unset [-f] [-v] [-n] [name ...]
for (( 表达式1; 表达式2; 表达式3 )); do 命令; done            until 命令; do 命令; done
function 名称 { 命令 ; } 或 name () { 命令 ; }         variables - 一些 shell 变量的名称和含义
getopts 选项字符串 名称 [参数]                       wait [-n] [id ...]
hash [-lr] [-p 路径名] [-dt] [名称 ...]          while 命令; do 命令; done
help [-dms] [模式 ...]                        { 命令 ; }



1<词>,2[句],3/段\,4{节},5(章)。
2016-2-9 07:10
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zzz19760225
超级版主




积分 3673
发帖 2020
注册 2016-2-1
状态 离线
『第 25 楼』:  编码的奥秘 作者英文字母若干

第1章 电 筒 密 谈
假若你才 1 0岁,你的好朋友与你临街而住,而且你们卧室的窗户面对着面 。每天晚上,
当父母像平常一样很早催你上床睡觉时,你可能还想与好朋友交流思想、发现、小秘密、传
闻、笑话和梦想,没有人可以责备你,毕竟 ,渴望交流是大多数人的天性。
当你们卧室还亮着灯时,你和你的好朋友可以临窗舞动手臂、打手势或以身体语言来交
流思想,但复杂一些的交流就有些困难了。而且一旦父母宣布“熄灯”,交流也就无法继续进
行了。
如何联系呢?用电话吗? 1 0岁的小孩子屋里有电话吗?即使有,你们的谈话可能被偷听。
如果家里的电脑通过电话线联了网,它可能会提供无声的帮助,不过很不幸,它也不会在你
的房间里。
你和朋友采用的方法是用手电筒。所有的人都知道手电筒是为孩子们藏在被窝里看书而
发明的,它也适合在黑暗中用来交流。它无声无息,且光的方向性很好,不会从卧室的门缝
中泄露而使家人起疑。
用手电筒的光可以交谈吗?这值得一试。一年级你就学过在纸上写字母和单词,把这种
方法运用到手电筒上看起来也合情合理。你所需做的就是临窗而站,用光画出字母。画字母
‘O’,就打开电筒,在空中画个圈,然后关上开关;字母‘ I’则是画竖直的一笔。但是你很
快发现这种方法行不通,当你注视来去飞舞的光柱时,会发现在脑海中将它们组合起来不是
件容易的事,这些光划成的圈圈杠杠太不准确了。
也许你曾经看过一部电影,影片中两个水手隔海用闪烁的光传递消息。在另一部电影中,
一个间谍用镜子反射阳光向一间屋子中被俘获的同伙发送讯息。这就给了你启发,你起先设
计一种简单的交流方法,使字母表中的每个字母与一定数目的闪烁相对应。 A闪一下, B闪两
下,C闪三下,如此递推, Z就闪烁2 6下。B A D这个词由字母间有间隔的两闪、一闪、四闪组
成,这样你不会误以为它是闪七下的字母 G了。词间的停顿则比字母间的停顿时间稍长一些。
这看起来很有希望,采用这种方法的优点是你不需要在空中挥舞手电简,只需对准方向
按开关就行了;缺点是你试图发送的第一个消息(“How are you?” )就需要 1 3 1次闪烁,更
糟的是,你忘了定义标点符号,所以无法表示句尾的问号了。
这离问题的解决已经很近了,你想别人以前肯定也遇到过类似的问题,你解决它的思想
一定是正确的。为了解决问题,白天的图书馆之行使你发现了神奇的摩尔斯电码(morse code),
这正是你想要的,即使你不得不重新学习如何“写”字母表中的字母。
以下就是区别:在你发明的体系中,每个字母是一定数目的闪烁,从闪烁一下的 A到闪烁
2 6的Z;而在摩尔斯电码中,有长短两种闪烁,当然,这会使摩尔斯电码更为复杂,但它在实
际应用中却被证实是更有效的。那句“ How are you?”现在仅需 3 2次而不是 1 3 1次闪烁,而
且这还包含了问号。
在讨论摩尔斯电码的工作原理时,人们并不说“长闪烁”、“短闪烁”,他们使用“点
(d o t)”和“划( d a s h)”,因为这样易于在印刷品上表示。在摩尔斯电码中,字母表中的每一2
编码的奥秘
下载
个字母与一个点划序列相对应,正如在下表中你所看到的:
尽管摩尔斯电码与计算机毫不相关,但熟悉它的本质却对深入了解计算机内部语言和软
硬件的内部结构有很大的帮助。
在本书中,编码或代码( c o d e)通常指一种在人和机器之间进行信息转换的系统(体系)。
换句话说,编码便是交流。有时我们将编码看成是密码 (机密),其实大多数编码并不是的。大
多数的编码都需要被很好地理解,因为它们是人类交流的基础。
在《百年孤独》的一书的开篇,马尔克斯回忆了一个时代,那时“世界一片混沌,许多
事物没有名字。为了加以区别才给事物各个命名。”这些名字都是随意的,没有什么原因说明
为什么不把猫称为狗或不把狗称为猫。可以说英语词汇就是一种编码。
我们用嘴发出声音组成单词,这些词可以为那些听得到我们声音,理解我们所用语言的
人所听懂,我们称这种编码为“口头语言”或“语音”。对写在纸上(或凿在石头上、刻在木
头上或通过比划写在空气中)的词,还有一种编码方式,那就是我们在印刷的报刊,杂志和
书籍上看到的字符,称之为“书面语言”或“文本”。在许多语言中,语音和文本间有很强的
联系。例如在英语中,字母或一组字母与一定的读音相对应。
手势语言的发明帮助了聋哑人进行面对面的交流。这是一种用手和胳膊的动作组合来表
达词语中的单个字母、整个词及其基本概念的语言。对盲人来说,他们可以使用布莱叶盲文
(B r a i l l e)。这种文字使用凸起的点代表字母,字母串和单词。当谈话内容要被迅速地记录下
来时,缩写和速记是很有用的。
人们在相互沟通时使用了各种不同的编码,因为在不同的应用场合,其中的一些较其他
的更为简便。例如,语言不能在纸上存储,所以使用了文字;语言、文字不适合用来在黑夜
中安静地传递消息,故摩尔斯电码是一个方便的替代品。只要一种编码可以适用于其他编码
所不能适用的场合,它就是一种有用的编码。
以后将看到,计算机中使用了不同的编码来传递和存储数字、声音、音乐、图像和视频
(电影)。计算机不能直接处理人类世界的编码,因为它不能模拟人类的眼睛、鼻子、嘴和手
指来接收信息。尽管这些年来计算机的发展趋势使我们的桌上电脑具有捕获、存储、处理和
提供人类交流中所使用的各种信息的能,而且不论这些信息是视觉的(文字和图片)、听觉的
(语言、声音及音乐)还是两者的混合(动画和电影)。所有这些信息都要求使用它们自己的
编码方式,正如交谈需要使用人的某些器官(嘴和耳朵),而书写和阅读则需要使用另外一些下载
第1章 电 筒 密 谈
3
器官(手和眼睛)一样。
用手电筒发送摩尔斯电码时,电筒的开关快速地合开代表一个点,让电筒照亮稍长的时
间则代表一个划。举例来说,发送字母 A,要先快速地合开开关,然后再稍慢些合开。在发送
下一个字母前要有短暂的停顿。约定划的时间大约是点的 3倍。例如,如果点的照亮时间为 1
秒,那么划就是 3秒。(实际上,摩尔斯电码的传递速度要快得多。)接收者看到了短闪和长闪
就知道是A。
摩尔斯电码中点划之间的间隔是极为关键的。例如,发送字母 A时,点划之间的间隔应与
一个点的时间大致相同(如果点的时间是 1秒,那么间隔的时间也是 1秒)。同一个词中字母间
间隔稍长,约为划的持续时间(或者 3秒,如果那是划的持续时间的话)。下面是单词“ h e l l o”
对应的摩尔斯电码,图中示意了字母间的间隔(隙):
单词之间相隔大约 2倍于划的时间(如果划是 3秒,那么间隔即为6秒)。下面是“ hi there”
对应的编码(码字):
手电筒开和关的时间长度并没有限定,这取决于点的时间长度,点长又由手电筒开关触
发的速度和摩尔斯电码发送者记忆电码的熟练程度来决定,熟练发送者的划也许与生手的点
等长。这个小问题会使接收电码有些困难,但在一两个字母之后,接收者通常就可以辨认出
哪个是点,哪个是划了。
粗看起来,摩尔斯电码的定义 — 这里所谓的定义是指与字母表中的字母相对应的各种
点划序列 — 与打字机字母的排列一样是随意的。但仔细观察后你会发现不完全如此,简短
的码字分配给了使用频率较高的字母,例如 E和T,爱赌博的人和“财富之轮”爱好者可能一
下就注意到了这个问题;不常用的字母如 Q和Z(它们在赌局中是 1 0点)则分配以较长的码
字。
几乎所有人都知道一点儿摩尔斯电码,国际遇险信号 S O S的摩尔斯电码为“三点三划三
点”。S O S并非缩写,选择它仅仅因为它有一个易记的摩尔斯电码序列。第二次世界大战中,
英国广播公司选用贝多芬第五交响曲中的片段作为节目前奏 — B A H 、 B A H 、 B A H 、
B A H M M M M M,听起来颇像摩尔斯电码中 V(代表Vi c t o r y)的码字。
摩尔斯电码的一个缺点是它没有对大小写字母进行区分。除表示字母外,摩尔斯电码还
用5位长的码字来表示数字:
这些数字的码字看起来还有些规律 (相对于字母对应的码字而言 )。大多数标点符号的码字
采用5位、6位或7位的码长:4
编码的奥秘
下载
对欧洲一些语言中的重音字母以及一些有特殊用途的缩写定义了特别的码字, S O S就是
这样一个缩写:发送时每个字母的码字之间仅有一点的时间间隔。
如果有特制的用于发送摩尔斯电码的手电筒,你和朋友之间的交流就方便多了。这种手
电筒除了常有的开关,还有一个按钮,按压按钮就可以控制电筒的亮灭。经过练习后,你们
每分钟可以发送和接收 5~1 0个单词。虽然仍比交谈慢(大概每分钟 1 0 0个词左右)但已足够
用了。
当你和朋友最终熟记了摩尔斯电码时(这是唯一精通发送接收的方法),你也可以用它代
替日常用的语言。为了达到最高的速度,可以发“滴( d i h)”音代表点、“嗒( d a h )”音代表划。
摩尔斯电码同样也可将文字简化为用点和划两个符号表示。
以上的关键在于“两”这个词 — “滴、嗒”两个声音,“点、划”两种方式。实际上任
何两种不同的东西经过一定的组合都可以代表任何种类的信息。下载
第2章 编码与组合
摩尔斯电码由萨缪尔・摩尔斯( 1 7 9 1—1 8 7 2)发明,本书后面会在多处提到他。摩尔斯
电码是随着电报机的发明而产生的,电报机我们以后也还要做详尽的说明。正如摩尔斯电码
很好地说明了编码的本质一样,电报机也提供了理解计算机硬件的良好途径。
大多数人认为摩尔斯电码的发送易于接收,即使你没有记住摩尔斯电码,也可以方便地
借助下面这张按字母顺序排列的表发送:
接收摩尔斯电码并将其翻译回单词比发送费时费力多了,因为译码者必须反向地将已编
码的“滴-嗒”序列与字母对应。例如,在确定接收到的字母是“ Y”之前,必须按字母逐个
地对照编码表。
问题是我们仅有一张提供“字母→摩尔斯电码”的编码表,而没有一张可供逆向查找的
“摩尔斯电码→字母”译码表。在学习摩尔斯电码的初级阶段,这张译码表肯定会提供很大的
便利。然而,如何构造译码表却毫无头绪,因为我们似乎无法找出这些按字母顺序排列的
“滴-嗒”序列的规律。
那么忘记那些字母序列吧,也许按照码字中“滴”
“嗒”的个数来排列会是个更好的尝试。
例如,仅含一个“滴”或“嗒”的摩尔斯电码序列只可能代表 E或T这两个字母之一:
两个“滴”或“嗒”的组合则代表了 4个字母I、A、N、M:
三个“滴”或“嗒”的序列代表了 8个字母:6
编码的奥秘
下载
最后(如果不考虑数字和标点符号的摩尔斯电码),四个“滴”或“嗒”的序列则共代表
了1 6个字母:
四张表共包括2 + 4 + 8 + 16 = 3 0个编码,可与3 0个字母相对应,比拉丁字母所需的2 6个字
母还多了4个。出于这个原因,在最后一张表中,你可能注意到有 4个编码与重音字母相对应。
在翻译别人发送的摩尔斯电码时,上面 4张表提供了极大的便利。当你接收到一个代表特
定字母的码字时,按其中含有的“滴”“嗒”个数,至少可以跳到其对应的那张表中去查找。
每张表中,全“滴”的字母排在左上角,全“嗒”的字母排在右下角。
你注意到 4张表大小的规律了吗?每张表都恰好是其前一张表的两倍大小。这其中包含的
意义是:前一张表的码字后加一个“滴”或加一个“嗒“,即构成了后一张表。
可以按下面的方式总结这个有趣的规律:
点划数
1
2
3 .
4
码字数
2
4
8
1 6
四张表中每张码字数都是前一张的两倍,那么如果第一张表含2个码字,第二张表则含2×2
个码字,第三张表 2×2×2个码字。以下是另一种表达方式:
点划数
1
2
3
4
码字数
2
2×2
2×2×2
2×2×2×2
当然,如果遇到数的自乘,可以用幂表示,例如 2×2×2×2可以写成 2 4 。数字 2、4、8、
1 6分别是 2的1、2、3、4次幂,因为可以用依次乘 2的方法将它们计算出来。由此我们的总结
还可以写成下面的方式:
点划数 码字数
1
2
3
4 2 1
2 2
2 3
2 4第 2章 编码与组合
下载
7
这张表简单明了,码字数是 2的次方,次方数目与码字中含有的“滴”“嗒”数目相同。
我们可以把表总结为一个简单的公式:
码字数 = 2 “滴”与“嗒”的数目
很多编码中都用到 2的幂,在下一章中我们会看到另一个例子。
为了使译码的过程更为简便,可以画出如下一张树形图:
这张表表示出了由“滴”与“嗒”的连续序列得出的字母。译码时,按箭头所指从左到
右进行。例如,你想知道电码“滴-嗒-滴”代表的字母,那么从最左边开始选择点,沿箭头
向右选择划,接着又是点,得出对应的字母是 R,它写在最后一个点的旁边。
如果认真考虑,会发现事先建立这样一张表是定义摩尔斯电码所必需的。首先,它保证
了你不会犯给不同的字母相同码字的错误!其次,它保证你使用了全部的可用码字,而没有
使“滴”与“嗒”的序列毫无必要的冗长。
我们可以加长码字至 5位或更长, 5位长的码字又提供了额外的 3 2(2×2×2×2×2或2 5 )
个码字。一般而言,这就足够 1 0个数字和 1 6个标点符号使用。实际上,摩尔斯电码中的数字
确实是5位的,但在许多其他编码方式中, 5位码字常用于重音字母而不是标点符号。
为了包含所有的标点符号,系统必须扩充至 6位表示,提供 6 4个附加编码,此时系统可表
示2 + 4 + 8 + 1 6 + 3 2 + 6 4共1 2 6个字符。这对摩尔斯电码而言太多了,以至于留下许多“未定义”
的码字。此处“未定义”指不代表任何意义的码字,如果在你接收的摩尔斯电码中有未定义
的码字,就可以肯定发送方出了差错。
由于推出了下面这条公式:
码字数 = 2 “滴”与“嗒”的数目
我们就可以继续导出更长的码字位数所代表的码字数目。很幸运,我们不必为确定码字数目
而写出所有可能的码字,我们所要做的不过是不断地乘 2而已:8
编码的奥秘
下载
点划数 码字数
1
2
3
4
5
6
7
8
9
1 0 2 1 = 2
2 2 = 4
2 3 = 8
2 4 = 16
2 5 = 32
2 6 = 64
2 7 = 128
2 8 = 256
2 9 = 512
2 10 = 1024
摩尔斯电码被称为二元码 (binary code),因为编码中仅含“滴”和“嗒”。这与一个硬
币很相似,硬币着地时只可能是正面或反面。二元事物(例如硬币)、二元编码(例如摩尔斯
电码)常常用2的乘方来描述。
上面所做的对二元编码的分析在数学上的一个分支 — 组合学或组合分析里只能算是一个
简单的练习。传统上,由于组合分析能够用来确定事件出现的几率,例如硬币或骰子组合的
数目,所以它常用于概率统计,但它也同样有助于我们理解编码的合成与分解。下载
第3章 布莱叶盲文与二元编码
摩尔斯不是第一个成功地将书写语言中的字母翻译成可解释代码的人,他也不是第一个
因为其编码而受到人们纪念的人,享有这个荣誉的是一个晚摩尔斯 1 8年出生的早慧的法国失
明少年。虽然人们对他的生平所知甚少,但就是所知的这一些却足以给后人留下深刻印象。
路易斯・布莱叶 1 8 0 9年出生于法国的 C o u p v r a y,他的家
乡在巴黎以东 2 5英里,父亲以打造马具为生。 3岁时,在这
个本不该在父亲作坊里玩耍的年龄,小布莱叶意外地被尖头
的工具戳中了眼睛。由于伤口发炎,感染了另一只眼,他从
此双目失明。布莱叶原本注定在贫困潦倒中度过一生(正如
那时大多数盲人一样),但他的聪明才智和求知欲不久即显
露了出来。在本地牧师和一位学校老师的帮助下,布莱叶和
其他孩子一道上了学, 1 0岁那年又前往巴黎的皇家盲人青年
学院学习。
盲人教育的一大障碍就是他们无法阅读印刷书籍。
Valentin Haüy(1745—1 8 2 2 ),巴黎学校的创始人,发明了一
种将字母凸印以供触摸阅读的方法。但这种方法使用起来较为困难,并且只有很少的书籍用
这种方法“制造”。
视力正常的 H a ü y陷入了一种误区。对他而言,字母 A就是A,它看起来(或感觉起来)也
必须像是个 A。(如果给他手电筒作为交流工具,他也会试图在空气中画出字母的形状,而我
们已经知道这种方法并不有效。)H a ü y也许没有意识到一种与印刷字母完全不同的编码会更适
于盲人使用。
另一种可选的编码有一个出人意料的起源。法国陆军上尉 Charles Barbier在1 8 1 9年发明了
一种他自称为 écriture nocturne的书写体系,这种体系也被称为“夜间文字。他使用厚纸板上
有规律凸起的点划来供士兵们在夜间无声地传递口信(便条),士兵们使用尖锥状的铁笔在纸
的背面刺点和划,凸起的点可以用手指感觉阅读。
B a r b i e r体系的问题是其过于复杂。 B a r b i e r没有用凸起的点来代表字母表中的字母,而是
用其代表声音。这样的系统中一个单词通常需要许多码字表达。这种方法在野外传递短小消
息还算有效,但对长一些的文章而言则有明显不足,更不要说是整本的书籍了。
布莱叶在 1 2岁时就熟悉 B a r b i e r方法了,他喜欢使用这些凸点,不仅因为它们易于用手指
阅读,更因为它们易于书写。教室里拿着铁笔和纸板的学生可以记笔记供课后阅读。布莱叶
勤奋地工作试图改进这种编码系统。不出 3年(在他 1 5岁时),他创建了自己的系统,其原理
直到今天还在使用。布莱叶系统有很长时间仅局限在他所在的学校使用,后来它逐渐扩散到
世界各地。 1 8 3 5年,布莱叶染上了结核病。 1 8 5 2年,在他4 3岁生日过后不久,他便去世了。
时至今日,布莱叶系统的改进版本甚至可以与有声录音带竞争,它为盲人提供了与书写
世界联系的途径。布莱叶方法仍是适于既聋又盲的人阅读的唯一方法。近来年,随着电梯和10
编码的奥秘
下载
自动语言机的普及,布莱叶系统更加广为人知。
本章将剖析布莱叶编码的编码方法及其工作原理,不过不必真正学习布莱叶编码或记住
任何东西,我们只要大概了解一下编码的本质就行了。
布莱叶编码中,普通书写语言的每个字符 — 具体而言如数字、字母和标点符号 — 都被
编码成局限在2×3小格中一个或多个凸起的点。这些小格一般被标记为 1~6:
在当今实际使用中,特殊的打字机或刻印机可以在纸上打出布莱叶编码中的小点。
由于在书中夹印几页布莱叶编码极其昂贵,我们使用了在通常印刷品中常用的布莱叶码
的表示方法。在这种表示方法中,小格中的 6个点全部印刷出来,大点代表小格中的凸起点,
小点则代表平滑的点。例如下图中的布莱叶字母中,点 1、3、5是凸起的,点2、4、6则没有:
在这里吸引我们的问题是:点是二元的。一个特定的点不是凸起的就是平滑的,那么 6个
点的组合数目就是 2×2×2×2×2×2,或6 4 ( 2 6 )。
因此,布莱叶编码系统可以代表 6 4个不同的码字。以下就是所有的 6 4个码字:
如果我们发现布莱叶编码只用了 6 4个码字中的一部分,我们会疑问为什么 6 4个码字中有
一些不被使用;如果发现布莱叶编码使用了多于 6 4个的码字,则又会让人怀疑我们是否神志
清醒或数字计算的真实性, 2乘2是等于4吗?
分析布莱叶编码,还是从基本的小写字母开始:下载
第3章 布莱叶盲文与二元编码
11
举例来说,短语“ you and me”在布莱叶编码中看起来是这样的:
注意,代表同一个单词中的字母的小格用一个小距离分隔,大一些的距离(一般是没有
凸点的小格)用来分隔不同的单词。
这就是布莱叶发明的布莱叶编码的基础,布莱叶还为法文中出现的重音字母设计了码字。
注意, W没有对应的码字,这时由于在古法语中没有 W(不必担心,这个字母最终还是会露
面的)。这样算来,我们仅使用了 6 4个码字中的 2 5个。
通过仔细的检查,会发现上面的布莱叶编码存在特定的规律。第 1行(从字母 a~j)只用
了小格的上面 4个点 — 点1、2、4、5;第2行除了点 3凸起外其余都与第 1行相同,第3行则除
了点3、6凸起外其余都与第 1行相同。
在布莱叶之后,布莱叶编码在许多方面有了扩展,现在大多数英语出版物所使用的系统
是二级布莱叶码。二级布莱叶码采用了许多缩写来简化编码树以提高阅读速度。以下的三行
(包括“完整的”第 3行)显示了下面这些词的码字:
因此,在二级布莱叶码中,短语“ you and me”被写成如下形式:
到现在为止,已描述了 3 1个码字 — 词间没有凸起点的空格和三行每行 1 0个用于字母和
单词的码字。这离理论上可用的 6 4个码字还相距甚远。不过我们将要看到,在二级布莱叶码
中,没有任何浪费的码字。
首先,我们使用 a~j的编码加上凸起的 6号点。它们代表词中的缩写,这其中包括 W和另
一个词的缩写:
举例来说,“a b o u t”可以用二级布莱叶码写成如下形式 :
其次,可以把代表字母 a~j的码字中的点下移一行,即仅使用点 2、3、5和6。这些码字根12
编码的奥秘
下载
据上下文代表标点符号或缩写:
头4个码字代表逗号、分号、冒号和句号。注意左括号和右括号用同一个码字代表,但左
引号和右引号则使用了不同的码字。
已经有5 1个码字了。接下来的 6个码字使用点 3、4、5、6尚未使用的组合来表示缩写和几
个额外的标点符号:
“b l e”的码字非常重要,因为当它不是单词的一部分时,它表明其后跟随的码字要被翻译
成数字,这些数字的编码与 a~j的编码相同:
由此,如下码字的序列代表数字 2 5 6:
如果你一直在计数的话,我们还需要 7个码字才能达到总计的 6 4个码字。下面就是剩余的
7个码字:
第一个(点 4凸起)是重音字母标识符,其余的作为一些缩写的前缀,也用于其他用途:
点4、6凸起时(本行的第 5个码字),该码字代表数字中的小数点或强调标识符,这由上下文
决定。点5、6凸起时,码字则是与数字标识对应的字母标识。
最后(也许你正在疑惑布莱叶编码如何表示大写字母),我们用 6号点来作为大写标识,
它表明其后跟随的字母是大写的。例如,可用如下的码字写出该编码创始人的名字:
这包含大写字母标识、字母 l、缩写o u、字母i和s,空格,另一个大写字母标识,字母 b、r、a、
i、l、l和e(在实际应用中,该名字还可以再删掉最后两个不发音的字母)。
总结一下,我们已经看到了 6个元素(凸点)如何恰好形成 6 4个码字。这 6 4个码字根据上
下文大多有双重含义,其中有数字标识以及取消数字标识作用的字母标识。这些标识改变了
跟随其后的码字的含义 — 从字母变数字或从数字变字母。起这种作用的码字常被称为“先
行码/前置码”或“转义码”,它们更改其后字符的含义直至更改作用被取消。
大写标识表示其后的字母(也仅有字母)应写成大写,这种码字被称为“换码代码”
。“换码
代码”使你“避免”那种单调的、常规的码字解释,而转入一种新的解释方法。在以后几章中可
以看到,当把书面语言转换为二元码字时,
“换码代码”和“转义码”的使用是很普遍的。下载下载
第4章 手电筒剖析
手电筒的用途极为广泛,用于在黑暗的遮盖物里阅读和用于发送编码消息只是两个用途
最明显的方面。最普通的家用手电筒也能在教学演示中说明神秘物质电( e l e c t r i c i t y)时扮演
中心角色。
电是一种令人称奇的现象,尽管它已得到普遍应用,但依然还保持着很大的神秘性,即
使对那些自称已经弄清楚它的工作原理的人而言也是这样。但恐怕不管怎么样,我们都必须
好好努力钻研一下电学。幸运的是,我们只需要明白一小部分基本概念就可以理解它在计算
机中是怎样应用的。
手电筒当然是一种大多数家庭都拥有的较简单的电器。拆开一支有代表性的手电筒,你
会发现它包括一对电池,一个灯泡,一个开关,一些金属片和一个把所有零件装在一起的塑
料筒。
只用电池和灯泡,就可以自己做一个简单的手电筒。当然,还需要一些短的绝缘线(末
端的绝缘皮除掉)和足够多的连接物:
注意上图右边两个松开的线端(头),那就是开关。如果电池有电并且灯泡也没有烧坏的
话,接触两个线端,灯就亮了。
这是我们要分析的头一个简单电路,首先要注意的是电路是一个回路。只有从电池到电
线、到灯泡、到开关、再回到电池的路径是连续畅通的,灯泡才会亮。电路中任何一点断开
都会引起灯泡的熄灭。开关的目的就是控制电路开闭这个过程。
电路环接的特性提示我们有某种物质在电路中循环移动,可能与水在水管里流动有某些
相似。“水与水管”的类比常用来解释电的工作机理,但最终它也像其他类比一样不可避免地
解释不下去了。电在宇宙中是独一无二的,必须用它的术语来解释它。
在对电的工作的理解中,最流行的科学理论是电子理论(electron theory),该理论认为电
起源于电子的运动。
众所周知,一切物质 — 我们能看到、感觉到的东西 — (通常)是由极其微小的被称为14
编码的奥秘
下载
原子的东西构成。每一个原子是由三种微粒构成的,即中子、质子和电子。你可以把原子画
成一个小的太阳系,中子和质子固定在原子核内而电子像行星环绕太阳一样围绕原子核运动:
需要解释一下的是该模型与你在一个放大倍数足够大的显微镜下看到的真正原子不是一模一
样的,它只是一个示例模型。
图中原子包含 3个电子、 3个质子和 4个中子,说明这是一个锂原子。锂是已知的 11 2种元
素之一,它们的原子序数由 1~11 2。一种元素的原子序数是指元素的原子核中质子的个数,
通常也是其电子数。锂的原子序数为 3。
原子能够通过化学合成形成分子,分子与组成它的原子的性质通常是不同的。比如水分
子包含两个氢原子和一个氧原子(即 H 2 O)。显然水既不同于氢气,也不同于氧气。同样,食
盐分子由一个钠原子和一个氯原子构成,而钠和氯都不可能成为法国馅饼的调味品。
氢、氧、钠、氯都属于元素,水和食盐都属于化合物。但是盐水是一种混合物,而不是
化合物,因为其中水和食盐都保持它们各自的性质不变。
一个原子的电子数通常等于其质子数。但在某种特定环境下,电子能从原子中电离出来,
这样电就产生了。
单词e l e c t r o n和e l e c t r i c i t y都源于古希腊词 η λ ε κ τ ρ ο ν( e l e k t r o n ) ,你可能猜它的意思就是“极
其微小而不可见的东西”。但事实并非如此 — η λ ε κ τ ρ ο ν的真正意思是“琥珀”,一种玻璃状
的硬质树液。这个看似不相关的词源来自于古希腊人所做的实验,他们用琥珀与木头相摩擦
而产生我们今天所说的静电。在琥珀上摩擦木头使木头从琥珀获得电子,结果木头所含的电
子数多于质子数而琥珀所含的电子数小于质子数。在更多的现代实验中,地毯能从鞋底获得
电子。
质子和电子具有带电荷的特性,质子带正电荷( +)、电子带负电荷(-)。中子是中性的,
不带电。即便我们用加减号来标明质子和电子,但符号并不表示算术运算中的加号和减号的
意思,也不表示质子拥有某些电子所不具备的东西。使用这些符号仅仅表示质子和电子在某
个方面性质相反。这个相反的特性也正表明了质子和电子是如何相互关联的。
当质子数与电子数相等时,它们是最适合和最稳定的。质子数与电子数的不平衡会导致
它们趋于平衡。静电火花就是电子运动的结果,是电子从地毯通过你的身体再流回到鞋子的
过程引起的。
描述质子和电子关系的另一条途径是注意观察异电性相吸同电性相斥的现象,但光凭看
原子结构图我们是不能猜想到的。表面上看原子核中挤在一起的质子是互相吸引的。质子是
通过比同性斥力大的某种力聚合在一起的,这种力叫强内力。释放核能的原子核裂变就是由
于强内力导致的。本章只讨论通过得失电子获得电(电能)的问题。
静电不只存在于手指触摸门把手时闪出的火花之中。暴风雨时,云层的下层积累电子而下载
第 4章 手电筒剖析
15
云层的顶层失去电子,闪电的瞬间,电子的不平衡马上消失。闪电正是大量的电子迅速从一
端转移到另一端的结果。
手电筒电路中的电能显然比电火花或闪电之中的电能要好利用得多。灯泡能稳定持续地
亮是因为电子并不是从一点跳到另一点。当电路中的一个原子把一个电子传给邻接的另一个
原子时,它又从另一个邻接的原子获得电子,而这个原子又从它的一个邻接原子获得电子,
如此依次循环。可见电路中的电就是从原子到原子的电子通路。
这不可能自发形成。仅仅只把一些破旧的电路材料连接在一起是不可能有电能产生的,
需要某种可以激发电子环绕电路移动的物质。再分析一下前面所画的简单手电筒电路图,可
以肯定激发电子运动的既不是电线,也不是灯泡,那么最有可能的就是电池了。
几乎每一个人都多少了解手电筒里所用电池的类型方面的一些知识:
• 它们都呈管状,且大小不同。比如有 D、C、A、A A和A A A等型号。
• 无论电池大小怎样,它们都被标有“ 1 . 5伏”。
• 电池的一端是平的,标有一个负号(-);另一端中间有一个小突起,标有一个正号
(+)。
• 要想设备正常工作,就要正确安装电池(注意电池极性)。
• 电池的电能最终将用尽。有的电池可以充电,有的不行。
• 由此可以猜测,电池是用某种奇特的方式产生电能。
所有的电池中都发生着化学反应,一些分子裂变成其他分子或者结合形成新的分子。电
池中有化学物质,这些化学物质就是用来起反应,从而在标有(-)的电池的一端(称为负
极或阴极)产生多余的电子而在电池的另一端(称为正极或阳极)需要得到电子。这样,化
学能转化为电能。
只有当某种特别的电子通过某条途径从电池负极出发,然后再传送到正极时,化学反应
才能发生。因此假如一节空电池放在那里,那么什么事也不会发生(事实上,化学反应还是
在进行的,只是速度极慢)。只有一条电路能将电子运离负极又为正极提供电子时,反应才会
发生。电子在下图电路中是沿逆时针方向运动的:
如果不是基于这个简单的事实:所有的电子,不管来自什么地方,都是一模一样的,否
则,来自电池的化学物质里的电子就不可能如此随意地与铜导线的电子混合在一起的。铜导16
编码的奥秘
下载
线的电子与任何其他电子是没有区别的。
注意,两个电池都是向着同一个方向。放在下面的电池的正极从上面电池的负极获得电
子,这样两个电池就好像结合形成了一个更大的电池,这个大电池一端为正极,另一端为负
极,其电压是3伏而不是1 . 5伏了。
如果把电池中的一个倒置,电路就会连不通,如下图所示:
在化学反应中,两个电池的正极都需要获得电子,但由于它们相互接触,电子无法通过某种
途径到达它们。如果两个电池的正极连上了 ,那么它们的负极也应该连上,如下图所示:
这样的电路还是能连通。电池的这种连接方法称为并联,前一种连接方法称为串联。并
联后的电压与单个电池电压同样都是 1 . 5伏。并联后的灯仍然可能亮,但不如串联时亮度大,
不过电池的寿命将会是串联时的两倍。
通常认为电池为电路提供电能,但同样也可以认为电路为电池化学反应的发生创造了条
件。电路将电子从负极传送到正极。电路中的化学反应将一直进行到所有的化学物质耗尽,
这时你就需要换电池或是给电池充电了。
电子从电池的负极到正极流经了导线和灯泡。为什么需要导线?电不能通过空气传导
吗?噢,可以说能,也可以说不能。电能够通过空气导通(尤其是潮湿的空气),否则也观察
不到闪电。但电不能很轻易地流经空气。
一些物质的导电能力比其他物质的导电能力明显要好。元素的导电能力取决于它内部的
原子结构。电子绕核旋转是在不同的轨道上的,这些轨道称为层。最外层只有一个电子的原
子最容易失去那个电子,这正是导电需要具备的性质。这些物质易导电因而被称为导体。铜、第 4章 手电筒剖析
下载
17
银和金都是良好导体,这三种元素位于元素周期表的同一列不是巧合。铜是最常用的导线材
料。
导电物质的对立物质称为绝缘物质。一些物质阻碍电的能力比其他物质阻碍电的能力强,
这种阻碍电的能力称为电阻。如果一个物质有很大的电阻 — 说明它根本不能导电 — 它就被
称为绝缘体。橡胶和塑料都是很好的绝缘体,因而它们常用来做电线的绝缘皮。在干燥空气
的情况下,布料和木材也是很好的绝缘体。其实只要电压足够高,任何物质都能导电。
铜的电阻很小,但它仍有电阻。导线越长,电阻越大。如果你用数里长的导线连接手电
筒,导线的电阻将会大得令手电筒不亮。导线越粗,电阻越小,这可能有点违反直觉。你也
许认为粗的导线需要更多的电来“充满它”。而事实上,导线越粗,电子越容易通过它。我已
经提到过电压,只是还没有给出它的定义。一节电池为 1 . 5伏特意味着什么呢?实际上,电压
— 得名于Count Alessandro Vo l t o ( 1 7 4 5—1 8 2 7 ),他于1 8 0 0年发明了第一节电池 — 是初等电
学中较难理解的概念之一。电压表征电势能的大小,无论一节电池是否被连通,电压总是存
在的。
假设有一块砖头。如果把它放在地上,它的势能很小。当你把它举起至离地面 4英尺高时,
它的势能就增加了。你只要把砖块扔下,就能感觉到势能的存在。当你在一座高楼的顶层举
着砖块时,它的势能更大。上面三个例子里,你只是拿着砖块而什么也没做,但砖块的势能
却不同。
电学里更早的一个概念是电流。电流取决于电路中飞速流动的电子的数量。电流用安培
来度量,它得名于 André Marie Ampére(1775—1 8 3 6 ),一般简称安,比如“ 1 0安的保险丝”。
当6 240 000 000 000 000 000个电子在1秒内流过一个特定的点时,就是 1安培电流。
用水和水管作个类比。电流与流经水管的水量很相似,而电压类似于水压,电阻类似于
水管的粗细程度 — 水管越小、阻力越大。因此水压越高,流过水管的水量越大;水管越小,
流过它的水量就越少。流过水管的水量(电流)与水压(电压)成正比而与水管的阻力(电
阻)成反比。
在电学中,如果知道电压和电阻的大小,就可计算出电流的大小。电阻 — 物质阻碍电流
通过的能力 — 用欧姆度量,得名于 G e o rg Simon Ohm (1789—1 8 5 4 ),他提出了著名的欧姆定
律,定律中表述
I = E / R
这里I表示电流, E表示电压, R表示电阻。
举个例子,让我们看一节空置的电池:
它的电压 E为1 . 5伏,这是电势能。因为电的正负两极只被空气导接,因而电阻(用 R表示)非
常、非常大,这就意味着电流 I等于1 . 5除以一个巨大的数,电流几乎为 0。
现在用一根短铜导线连接电池的正负两极(从现在开始,本书中导线外的绝缘皮不再表
示出来):18
编码的奥秘
下载
我们已经知道这是短路。电压仍是 1 . 5伏,但电阻很小,这时电流等于 1 . 5除以一个很小的数,
也即意味着电流很大。很多很多的电子将流过导线。实际上,电流将受到电池物理大小的限制。
电池不可能导通如此大的电流,且实际电压也将低于 1 . 5伏。如果电池足够大,导线将会发热,
因为电能转化为了热能。如果导线变得很热,它将会发光(辉光放电)甚至可能熔化。
绝大部分电路都介于这两个极端之间。可以把它们统一表述为如下图:
电气(子)工程师用折线来表征电阻。这里它表示电阻不是特别大,也不是特别小。
如果导线的电阻很小,导线将发热发光,这就是白炽灯的工作原理。白炽灯泡是由美国
最著名的发明家托马斯・爱迪生( 1 8 4 7—1 9 3 1)发明的。在他致力于发明灯泡的时候( 1 8 7 9
年),这个思想已被普遍接受并且同时还有不少其他发明家在研究这个问题。
灯泡里的细线叫灯丝,通常用金属钨做成。灯丝的一端连在基座底部的尖端,另一端连
在金属基底的一个侧面,用一个绝缘体将它与尖端分开。细线的电阻使它发热。如果暴露在
空气中,钨就会由于达到燃烧温度而烧起来。但在灯泡的真空里,钨丝就发亮了。
大多数普通手电筒用两节电池组成一组,总电压是3 . 0伏。且选用电阻大约为 4欧姆的灯泡。
这样,电流等于 3除以4即0 . 7 5安培,也就是 7 5 0毫安。这就意味着每秒钟有 4 680 000 000 000
000 000 个电子通过灯泡。(注意,如果你用欧姆表直接测量手电筒灯泡的电阻,你只会得到
一个比4欧姆小得多的结果。这是因为钨的电阻还与它的温度有关系,温度越高,电阻越大。)
你可能已经发现,你买回家的灯泡上标记了特定的瓦特数。瓦特这个名词取自于著名的
蒸气机发明家詹姆斯・瓦特( 1 7 3 6—1 8 1 9)。瓦特是功率P的单位,它用下式计算
P = E×I
手电筒是3伏,0 . 7 5安培,那么灯泡的功率就要求 2 . 2 5瓦特。
家用照明灯大约为 1 0 0瓦特,这是为家用电压 1 2 0伏设计的。在这种情况下,电流为 1 0 0瓦
除以1 2 0伏即大约0 . 8 3安培。因此,1 0 0瓦特灯泡的电阻为 1 2 0伏除以0 . 8 3安培即1 4 4欧姆。
到此,我们大致分析了手电筒的每一个组成部分 — 电池、导线和灯泡。但是我们遗漏了
一个最重要的部分、对,是它的开关。开关控制电路的开闭。当开关允许电流动时,我们说
它是开的或合上的,而关的或断开的开关是不允许电流动的。(这里所表示的开、关的状态正
好与门相反,合上的门不允许事物通过的,而合上的开关允许电通过。)开关或开或关,电流
或有或无,灯泡或亮或不亮,就像摩尔斯和布莱叶发明的二元码一样,简单的手电筒或亮或
不亮,它没有中间状态。二元码与电气电路之间的相似性将在后面的章节中起很大作用。下载
第5章 绕过拐弯的通信
你1 2岁了。一天,你最要好的朋友一家要搬到另一个镇上去了。此后,你经常和他在电
话里聊天,但电话交谈与那些后半夜的手电筒摩尔斯电码会话完全不一回事。住在你隔壁的
另一个好朋友最终成为你新的最要好的朋友。现在到了该教你的新朋友一些摩尔斯电码,让
后半夜的手电筒重新亮起来的时候了。
问题是你的新朋友的卧室窗户与你的不是面对面的。房子是挨着的,卧室的窗户都朝着
同一个方向。除非你想办法在室外支起一些镜子,否则手电筒现在是不能适用来在黑夜中通
信的。
怎么办呢?
现在,你可能已经知道有关电的一些知识了,因此你决定用电池、灯泡、开关和导线来
做自己的手电筒。最初的实验中,你在你的卧室里接好电池和开关。两条导线接出你的窗子,
跨过篱笆,再接进你朋友的卧室,并在那里再连好灯泡 :
你的房子
你朋友的房子
尽管图中只示意了一节电池,但实际上你可能得用两个。在下面和以后的图中,用下图
表示断开的开关 :
用下图表示闭合的开关:
本章的手电筒与上一章中手电筒的工作原理是相同的,尽管本章的手电筒中连接组件的
导线要长得多。当你闭合开关时,你朋友那边的灯泡就亮了 :
你的房子
你朋友的房子20
编码的奥秘
下载
现在你可以用摩尔斯电码来发送消息了。
一旦有一个手电筒起作用,你可以做另一个远距离手电筒,好让你的朋友可以发送消息
给你:
你的房子
你朋友的房子
祝贺你! 你已经装上了一个双向电报系统。你可能注意到这两个相似的电路彼此完全独立
而没有联系。理论上,你可以给你的朋友发送消息而同时你的朋友也可以给你发送消息(尽
管对于你的大脑而言,同时阅读和发送消息可能比较困难)。
聪明的你发现如下改装电路能让你节省 2 5 %的导线:
你的房子
你朋友的房子
注意,现在两个电池的负极接在一起了。两个回路(电池到开关到灯泡再到电池)仍是
独立工作,尽管它们连在一起像连体双胞胎。
这种连接叫公用连接。在这个电路中,公用部分从左端灯泡和电池的接合点直到右端灯
泡和电池的接合点。图中接合点用黑点标记出来了。
进一步分析一下。首先当你按下开关,你朋友那边的灯就亮了。图中浅色回路中有电流
流过:
你的房子
你朋友的房子
在电路的其余部分里没有电流流过,因为没有了可让电子通过的回路。
当你不发消息而你的朋友发消息时,你朋友房间里的开关控制你房间里灯泡的亮灭。在第5章 绕过拐弯的通信
下载
21
下图浅色回路中有电流流过:
你的房子
你朋友的房子
当你和你的朋友想要同时发消息时,有时两个开关同时断开,有时一个断开一个闭合,
有时两个同时闭合。在最后一种情况下,电路中电的流动如下图所示:
你的房子
你朋友的房子
公用部分(两个接合点之间 )没有电流流过。
通过公用部分把两个独立电路连接成一个电路,已经把两栋房子之间的四条导线减少到
了三条,也即减少了 2 5 %的导线开支。
如果不得不接很长距离的线路,我们可能会想到再减少一根导线。但不幸的是对于 1 . 5伏
的D号电池和小灯泡,这是不合适的。如果用的是 1 0 0伏的电池和大得多的灯泡时,那就有办
法了。
这是个窍门:如果你要搭建电路的公用部分,你不需要任何导线。你可以用另外某种东
西取代它。你所用的取代物是一个直径大约为 7 9 0 0英里,由金属、岩石、有机物等多为无生
命的物质组成的巨大球体。它就是地球。
上一章描述的良导体中有银、铜和金。事实上,地球不是一个很好的导体,尽管某些部
分(如沼泽)的导电性能比其他部分(如干沙漠)要好得多。但我们知道导体越大越好,一
根很粗的导线比一根很细的导线要强得多。这是地球的优势,它的确非常非常大。
要用地球做导体,并不是把一根小细线插到马铃薯旁边的地里就可以了。你还必须使用
某种东西以维持和地球的真正接触,这也就是需要一个大面积的导体。一个很好的解决办法
是用一根至少 8英尺长, 1 / 2英寸粗的粗铜柱,它能提供与地面 1 5 0平方英寸的接触。你可以用
一个大锤子把它砸进地下,然后再接一根导线。如果你家的水管是铜质的,且从房子外的地
下接进来的话,那么你只要把一根导线与水管相连就可以了。
与地球的电性连接(也就是我们常说的接地)在英国叫 e a r t h ,在美国叫 g r o u n d。用g r o u n d
可能会引起一点点儿误会,因为它也经常用来指电路的公用部分。本章除非特别声明,否则
g r o u n d都指与地球的物理连接。
画电路图时常用下面这个符号表示接地:22
编码的奥秘
下载
电气工程师们使用这个符号是由于他们不喜欢费时间画一个埋在地下的 8英尺长的铜柱。
让我们来看看它是怎么工作的。从分析单回路开始:
你的房子
你朋友的房子
如果你使用的是高压电池和大灯泡,你只需要在你和你朋友的房子之间接一根导线,因
为你可以用大地来做导体:
你的房子
你朋友的房子
当你断开开关,电子的流动如下图所示:
你的房子
你朋友的房子
电子从你朋友房子的地下出发,通过灯泡、导线和你房间里的开关,然后进入电池的正
极。电子由电池的负极进入地下的。
也许你还真的很想看到电子从埋在你家后院的 8英尺长的铜柱进入地下,飞速地通过大地
到达埋在你朋友家后院的铜柱。
但是当你考虑到地球在为世界上数以千计的电路完成此功能时,你也许会问:这些电子
怎么知道该到哪儿去呢?显然它们不知道。这里要用地球的一个特殊性质来解释。
是的,地球是一个巨大的导体,但它同时也是电子的来源和仓库。地球对于电子而言就
好像大海对于水滴而言。地球的确是电子无尽的源头,也是电子巨大的存储池。
但是地球也有电阻,这就是为什么如果用 1 . 5伏的D号电池和手电筒灯泡就不能用接地来
减少电路开支的原因。地球对于低电压电池而言电阻实在太大了。第5章 绕过拐弯的通信
下载
23
你可能注意到上面两张画了电池的图中,电池的负极接地了:
以后将不再画接地的电池,而用代表电压的字母 V来代替它。单回路灯泡电报机现在如下
图所示:
你的房子
你朋友的房子
V代表电压,但它也可以表示吸取器。把V看成电子吸取器,把大地看成电子的海洋,电
子吸取器从地下吸取电子,放入回路,使之工作(比如点亮灯泡)。接地有时也被看成零电势,
意味着没有电压存在。电压 — 像早先解释的 — 是一种电势能,就像悬浮的砖块具有势能一
样。零电势就好像摆在地上的砖块 — 它不能再往什么地方掉下去了。
在第4章中,我们注意到的一件首要的事情是电路是一个回路。新电路看起来一点儿都不
像回路,但它仍然是回路。你可以用负极接地的电池代替 V,然后用一根线把所有有接地符号
的地方连起来,你将得到与本章开始时一样的电路图。
因此,通过一对铜柱(或是自来水管)的帮助,可以只用两根跨越你和你朋友房子之间
篱笆的导线就建立起了双向摩尔斯电码系统:
你的房子
你朋友的房子
这个电路与先前的三线配置电路功能相同。
本章已经迈出了通信改革中的关键性一步。最初,我们只能通过直线视觉和在手电筒的
可见范围内进行摩尔斯电码通信。
使用电线,不仅突破了直线视觉的限制,而且通过建立系统来绕过拐弯进行通信,我们还
摆脱了距离的限制。只要搭造更长更长的线路,就可以越过成百上千英里进行通信。
对了,这还不太准确。尽管铜是电学上很好的导体,但它不是最完美的。导线越长,电24
编码的奥秘
下载
阻越大;电阻越大,电流越小;电流越小,灯泡越暗。
那么导线可以造多长呢?因情况而定。假设你正在使用原来四根线的双向电路,无接地
和公用,并且还用手电筒和灯泡。为了节省开支,你先从电器行买了一些 2 0号规格的电话线,
每1 0 0英尺$ 9.99。电话线是用来连接你的扩音器和立体声系统的。它有两根导线,因此它是
电报系统的上佳选择。如果你的卧室与你朋友的卧室不到 5 0英尺远,只用一捆电话线就够了。
美国的导线粗细规格为 AW G。AW G数越小,导线越粗,电阻越小。你所买的 2 0号规格电
话线直径大约 0 . 0 3 2英寸,每 1 0 0 0英尺大约 1 0欧姆电阻,这样对于卧室之间 1 0 0英尺长的回路
电阻为1欧姆。
这并不坏,但如果要连上英里的线呢?线的总电阻将达到 1 0 0欧姆以上。回想一下上一章
中,灯泡电阻仅为 4欧姆。利用欧姆定律,可以很容易地计算出电路中的电流不再是以前的
0 . 7 5安(3伏除以4欧),而是比0 . 0 3安还小( 3伏除以1 0 0欧以上)。几乎可以肯定,电流的大小
不够点亮灯泡。
使用粗线是一个很好的解决方法,但价格太昂贵。 1 0号规格线(电器行的汽车电路耦合
线价格为每3 5英尺$ 11 . 9 9,而且你需要双倍长度因为它只有单线)大约 0 . 1英寸粗, 1 0 0 0英尺
为1欧姆,即1英里5欧姆。
另一个解决办法是增加电压,使用大电阻灯泡。比如使用 1 2 0伏电压的 1 0 0瓦家用照明灯
泡的电阻为 1 4 4欧姆。电线的电阻对于整个电路电流的影响将大大减小。
接下来的是1 5 0年前,人们在美洲和欧洲之间搭建第一个电报系统时所面临的问题。不管
电线多粗,电压多高,电报线还是不能无限延长。根据计划,工作系统的极限为 2 0 0英里。这
与纽约和加利福尼亚间的上千英里距离相差太多。
这个问题的答案 — 不是为手电筒,而是为过去的嘀嗒电报 — 虽说是一个简单易行的设
备,但是通过它,整个计算机得以构造。



1<词>,2[句],3/段\,4{节},5(章)。
2016-2-9 07:20
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zzz19760225
超级版主




积分 3673
发帖 2020
注册 2016-2-1
状态 离线
『第 26 楼』:  

第6章 发报机与断电器
1 7 9 1年,萨缪尔・摩尔斯生于马萨诸塞州的查尔斯顿镇,该镇是邦克山之战的地点,也
是波士顿东北重镇。摩尔斯出生那年,美国宪法刚实施两年,乔治・华盛顿出任美国第一个
任期的总统职务。 C a t h e r i n e大帝统治俄国。路易十六世和 Marie Antoinette在两年后的法国大
革命中被送上断头台。 1 7 9 1年,莫扎特完成了《魔笛》,他的最后一部作曲,次年于 3 5岁时去
世。
摩尔斯在耶鲁受过教育,又在伦敦学过艺术,他是位著名
的肖像画家。他的作品《 General Lafayette》( 1 8 2 5 )珍藏于纽约
市政大厅。 1 8 3 6年,他曾参与过竞选纽约市市长且获得了 5 . 7 %
的选票。他也是早先的摄影术狂热爱好者。他从 Louis Daguerre
本人那儿学习了银版相片的制作,制造出了美国第一批用银版
照相术制成的相片, 1 8 4 0年,他把这个手艺传授给了 1 7岁的
Mathew Brady 。此人以及他的同事后来为美国内战、亚伯拉
罕・林肯和摩尔斯本人留下了一些很有纪念价值的照片。
这些只是一个多职业生涯者的足迹。摩尔斯最著名的贡献
在于他发明了电报和以他名字命名的编码。
世界范围内的即时通信我们已经很熟悉,但它是当今新技
术发展的结果。 1 9世纪早期,你可以即时通信和远距离通信,但不能同时达到两个要求。即
时通信只能限制在你的声音能达到(没有扩音器可用)或是你的眼睛能看到(也许得用望远
镜)的范围;远距离通信则要花时间用信件通过马车、火车或者轮船的方式来实现。
在早于摩尔斯发明的年代里,人们曾做过许多加速远距离通信的尝试。一种技术上简单
的方法是雇佣一批人接力,站在山顶上用旗语信号通信。技术上稍微复杂一点儿的方法是使
用巨大的带有可动手臂的装备,原理与旗语相同。
电报思想的正式成形是在 1 9世纪早期。 1 8 3 2年在摩尔斯开始试验之前,已经有其他科学
家在做一些试探。原理上讲,电报思想很简单:你在线的一端做某些事引起线的另一端发生
了某些事。这正是上一章用远距离手电筒所做的事情。但摩尔斯不可能使用灯泡作为他的信
号设备,因为实用性灯泡直到 1 8 7 9年才发明出来。摩尔斯使用的是电磁现象。
如果你取一只铁棒,用细导线将它绕几百圈,然后让电流通过导线,铁棒变成了磁铁,
这时它就能吸引其他的铁和钢。(电磁铁上细线的电阻足够大以防止电磁铁形成短路。)移开
电流,铁棒的磁性消失:26
编码的奥秘
下载
电磁铁是电报的基础。一端上开关的闭合引起另一端上的电磁铁产生一些动作。
摩尔斯最早的电报机比后来改进的要复杂得多。摩尔斯认为电报系统应该在纸上实际写
点儿什么 (这就像后来的电脑使用者描述的“生成一个硬拷贝” )。这当然不必是文字,因为文
字太复杂,但某些字符应该记录下来,或曲线或点或划。注意,摩尔斯坚持要用纸记录下发
报内容的这种想法,与 Valentin Haüy要求盲人书籍应该使用突起的字母文字一样。
尽管摩尔斯早在 1 8 3 6年就告知专利局他已经成功地发明了电报,但直到 1 8 4 3年,他才说
服议会为此设备的示范表演出资赞助。 1 8 4 4年5月2 4日是有历史意义的一天, Wa s h i n g t o n和
马里兰州巴尔的摩之间的电报线成功地传送了圣经上的一句话“ What hath God wrought!”。
传统电报机发送消息的核心部分如下图所示:
尽管外观比较怪,但它只是一个为高速开合(闭)设计的开关,称为“按键 /按钮”。长时
间按键最舒适的方式是在手掌的拇指、食指和中指之间握住把手,然后敲击。短时间敲击形
成摩尔斯电码的点,长时间敲击形成摩尔斯电码的划。
线的另一端是一个接收机,其基本结构是一个电磁铁吸拉一根金属拉杆。起初电磁铁控
制的是一支笔,当由小装置控制的机械通过弯曲的弹簧缓慢地拖拉一卷纸时,相连的笔上下
蹦弹将点划记录在纸上,懂得摩尔斯电码的人再将点划翻译成字母和文字。
当然,人是会偷懒的。电报机使用者很快发现只要简单地利用笔跳上跳下的声音他们就
能翻译编码。笔的装置最终被撤消,代替的是传统电报机的发声装置,称为“发声器 /音响器”,
结构如下:
当电报机的键按下时,发生器的电磁铁将可动棒拖下发出“滴”的声音;当键放开时,
棒弹回初始位置,发出“嗒”的声音。快速的“嘀嗒”为点,慢速的则为划。
按键、发声装置,电池和一些导线可像上一章所述手电筒电报一样连接起来:
你的电报站
你朋友的电报站第 6章 发报机与继电器
下载
27
我们已经知道,两个电报站之间不需要两根线。如果大地作为另一半回路的话,一根线
就足够了。
如上一章所做,我们用字母 V代替接地的电池,因此最终的单向设置如下图所示:
你的电报站
你朋友的电报站
双向通信只不过再需要一个按键和发生器。与上章所做相似。
电报的发明真正标志着现代通信的开始。人类首次能够在眼、耳的范围之外以快于马奔
跑的速度通信。发明中使用的二元码是其精华所在,但在后来的电子和无线电通信中,包括
电话、收音机和电视,二元码都没有用到,只到最近二元码才出现在计算机、 C D盘、D V D盘、
数字卫星电视广播和高清晰电视中。
摩尔斯的电报机战胜了其他设计 ,部分原因是它对不好的电线状态的容忍度比较大。假如
你在按键和发声装置之间接一根线,该电报机通常可以工作,但其他电报系统却不具备这样
的容忍性。但正如上章所谈及的,最大的问题在于长距离导线的电阻。尽管一些电报线使用
高达3 0 0伏的电压能在3 0 0英里的范围内工作,导线还是不能无限延伸。
一个明显的解决办法是使用转发(中继)系统,也称继电器系统。大约每 2 0 0英里就让某
位发报者通过发声装置接收消息再用按键发送出去。
现在想像一下你已被某电报公司雇佣为转发系统的工作人员。他们把你放在纽约和加利
福尼亚之间某个地方的一间简陋得只有一张桌子和一把椅子的小屋里。一根导线从东边的窗
户进来连到发声装置上。你的按键连在电池和从西边窗子出去的导线上。你的工作是接收来
自于纽约的消息然后把它们发送到加利福尼亚。
起初,你是接收了整条消息后再转发它。你记录下发声器的嘀嗒,到消息接收结束,你
再用你的按键将它们发送出去。最终你掌握了边听边发的技巧而不用把整条信息记录下来,
这节约了转发时间。
某天你在转发消息时,你注意到铁棒上下跳动又注意到了手指按动键的上下跳动。你看
了看发声器又看了看键,然后你意识到棒的上下跳动与按键的上下跳动是一致的,于是你出
去取回一根小木条,用这根木条和一些线把发声器和按键连接了起来:
输入
现在它可以自动工作了,你可以去喝下午茶也可以去钓鱼了。
输出28
编码的奥秘
下载
这只是一个趣味情景的想像。但实际上,摩尔斯很早就理解这个装置的思想。我们已经
发明的这个装置叫重发器或继电器。一个继电器就像一个发声装置,输入的电流形成电磁用
以拖动金属杆,金属杆作为开关的一个部分连接到外接的导线上。这样,微弱的输入电流被
扩大形成比较强的输出电流。
继电器的概要描述如下图所示:
输出
输入
输入电流激发电磁铁,电磁铁吸引一根有弹性的金属条作为开关从而输出电流:
输出
输入
因此电报按键、继电器和发声器大致连接如下:
你的电报站
继电站
你朋友的电报站下载
第 6章 发报机与继电器
29
继电器是一种卓越的设备。它是一个开关,但并不是由人工而是借助于电流进行开关操
作的。利用这种设备可以做出令人惊奇的事情。事实上,你可以用继电器装配出一台计算机
中的大部分部件。
是的,继电器这种设备是一种很好的发明,足以与电报相提并论。后面还将会用到,且
它会变得非常小巧、方便。但是,在能够使用它之前,得先学会数数。下载
第7章 十进制记数法
语言仅仅是一种编码的想法似乎很容易被人们接受,很多人在学生时代至少学过一种外语,
因此,我们知道在英语中“ c a t”(猫)也可以被叫作 g a t o、c h a t、K a t z e、K O I I I K或κ α π α。
然而,数字不那么容易随文化的不同而改变。不论那种语言,也不管怎样读那些数字,
地球上我们能够遇到的几乎所有的人都用同样的方式来写数字:
数学,从某种意义上来说是不是可以称得上是一种世界语言呢?
毫无疑问,数字是我们平时能够接触到的最抽象的代码。当你看到数字“ 3”时并不需要
立即将它和任何事情相联系。你可能将它设想为 3个苹果或者 3个其他什么东西,但是当你从
上下文中得知这个数字是指某个小孩的生日、电视频道、曲棍球比赛的得分或者是制作蛋糕
的食谱中提供的需要面粉的杯数时,也能够像认为它代表 3个苹果时一样自然。因为数字一开
始产生时就很抽象,所以让我们理解这些苹果:
并不一定要用符号“3”来表示就更困难了。本章的很大一部分以及下一章将来讲解这些苹果:
也可以用“ 11”的形式来表示。
先不讨论数字1 0与生俱来的特殊性。大多数人使用的数字系统是基于 1 0(有时候是 5)的,
这种情况并不奇怪。最初人们是用手指来数数的。要是人类进化成有 8个或1 2个手指,人类计
数的方式就会有所不同。英语 D i g i t(数字)这个单词也可以指手指或脚趾,单词 f i v e(五)和
单词f i s t(拳头)有相同的词根,这种情况并不是巧合。
这样看来,人类选择使用以 1 0为基础的记数方法(或称为十进制记数法)完全是任意的,
但我们赋予 1 0的整数次幂重大的意义,并给它们命名:十个一年是一个十年;十个十年是一
个世纪;十个世纪是一个千年;千个一千是百万;千个百万是十亿。下面是 1 0的各次幂:
1 0 1 = 10
1 0 2 = 100
1 0 3 = 1000(千)
1 0 4 = 10 000
1 0 5 = 100 000
1 0 6 = 1 000 000(百万)
1 0 7 = 10 000 000
1 0 8 = 100 000 000
1 0 9 = 1 000 000 000(十亿)下载
第 7章 十进制记数法
31
多数历史学家认为数字最初创造出来是用来数东西的,比如:人数、财产数、商品交易
量等。举个例子来说,假定某个人有 4只鸭子,他可能画 4只鸭子作为记录:
后来,专门负责画鸭子这项工作的人想:“我为什么一定要画 4只鸭子呢?为什么不能只
画1只鸭子,然后用其他方法(管它用什么方法,哪怕用一条竖线来代表一只鸭子)来表示有
4只呢?”
但若某人有 2 7只鸭子,用画竖线来表示鸭子只数的方法就显得很荒谬了:
于是,有人想到得有一种好的办法才行,数字系统就这样诞生了。
在早期的数字系统中,只有罗马数字系统沿用至今。钟表的表盘上常常使用罗马数字,
此外它还用来在纪念碑或雕像上标注日期、标注书的页码,或作为提纲条目的标记。最令人
惊奇的是罗马数字常用在电影中做版本说明。(只要你有足够快的速度将字幕结尾处出现的
M C M L I I I译码,通常情况下就可以回答“这部影片是什么时候拍的”这个问题。)
2 7只鸭子可以用罗马数字这样表示:
这里用到的概念非常简单: X代表1 0条竖线,V代表5条竖线。
现在仍在使用的罗马数字有:
字母I代表一个一,这可能来自于一条竖线或者伸出的一个手指。字母 V很可能是一只手
的符号,代表五;两个字母 V组成字母X,代表十;字母 L代表五十;字母 C来自于拉丁文中表
示一百的单词 — c e n t u m;字母D代表五百;最后,字母 M来自拉丁文中的单词 — m i l l e,代
表一千。
也许你不一定同意,很长一段时间以来,罗马数字被认为用来做加减运算非常容易,这
也是罗马数字能够在欧洲被长期用于记帐的原因。事实上,当对两个罗马数字进行相加运算
时,只需将这两个罗马数字的所有符号合并然后用下面的方法将其简化:五个 I是一个 V,两
个V是一个X,五个X是一个L,等等。
但使用罗马数字做乘除法是很难的。很多其他早期的数字系统(比如古希腊数字系统)
和罗马数字系统相似,它们在做复杂运算时存在一定的不足。尽管如此,古希腊人所发明的32
编码的奥秘
下载
非凡的几何学至今仍是中学的一门课程,古希腊人不是以代数享誉世界的。
我们现在使用的数字系统通常称为阿拉伯数字系统,或称为印度—阿拉伯数字系统。它
起源于印度,但由阿拉伯数学家传入欧洲。一位著名的波斯数学家 — Muhammed ibn-Musa
a l - K h w a r i z m i(由它的名字得到单词 a l g o r i t h m(算法))在大约公元 8 2 5年写了一本代数书,
书中用的就是印度的数字系统(阿拉伯数字)来计数。产生于公元 11 2 0年的拉丁文译本对整
个欧洲用现在的阿拉伯数字代替当时使用的罗马数字的过渡过程产生了很大的影响。
印度—阿拉伯数字系统与先前的数字系统相比在以下三个方面不同:
• 印度-阿拉伯数字系统是和位置相关的,也就是说,一个数字依据位置的不同代表不同
的数量。数字的位置和数字的大小一样,都是很重要的。(但实际上,数字的位置更重
要。)1 0 0和1 000 000中都只有一个1,但我们知道一百万比一百要大得多。
• 几乎所有早期的数字系统都有一个阿拉伯数字所没有的东西,那就是用来表示数字 1 0的
一个专门的符号。现在使用的数字系统中是没有代表 1 0的专门符号的。
• 另一方面,几乎所有早期的数字系统都缺少一个阿拉伯数字中有的,而且事实证明是比
代表数字1 0的符号重要得多的符号,那就是零。
是的,就是零。这个小小的零毫无疑问是数字和数学历史上最重要的发明之一。它支持
位置表示法,因为它可以将 2 0 5与2 5 0区别开来。数字零也使得与位置无关的数字系统中非常
复杂的运算变得简单,尤其是乘除法。
印度—阿拉伯数字的整体结构是以读它们的方式展现的。拿 4 8 2 5作为例子,我们把它读
作“四千八百二拾五”,意思是:
四个一千
八个一百
两个十
一个五
或者,可以将它的组成写成这样:
4 8 2 5 = 4 0 0 0 + 8 0 0 + 2 0 + 5
或者,可以将它进一步分解,写成这样:
4 8 2 5 = 4×1 0 0 0 +
8×1 0 0 +
2×1 0 +
5×1
另外,也可以使用 1 0的整数次幂的形式,重新写成:
4 8 2 5 = 4×1 0 3 +
8×1 0 2 +
2×1 0 1 +
5×1 0 0
记住,任何数的 0次幂都等于 1。
多位数中的每位都有特定的意义,如下图所示。这 7个方格可以表示从 0~9 999 9999的任
何一个数字:第 7章 十进制记数法
下载
33
1的个数
10的个数
100的个数
1000的个数
10 000的个数
100 000的个数
1 000 000的个数
每一个位置(位)与 1 0的一个整数次幂相对应。不需要一个专门的符号来表示数字 1 0,
因为可以将 1放在不同的位置,用 0作为占位符。
分(小)数可以同样的形式作为数字放在十进制数的小数点的右边,这一点非常好。数字 4 2
7 0 5 . 6 8 4是:
4×10 000+
2×1 0 0 0 +
7×1 0 0 +
0×1 0 +
5×1 +
6÷1 0 +
8÷1 0 0 +
4÷1 0 0 0
该数也可以写成不带除法的形式,如下:
4×10 000+
2×1 0 0 0 +
7×1 0 0 +
0×1 0 +
5×1 +
6×0 . 1 +
8×0 . 0 1 +
4× 0 . 0 0 1
或写成1 0的整数次幂的形式:
4×1 0 4 +
2×1 0 3 +
7×1 0 2 +
0×1 0 1 +
5×1 0 0 +
6×1 0 -1 +
8×1 0 -2 +
4×1 0 -334
编码的奥秘
下载
注意1 0的指数是怎样变到零再变成负数的。
我们知道, 3加上4等于7。同样, 3 0加上4 0等于7 0,3 0 0加上4 0 0等于7 0 0,3 0 0 0加上4 0 0 0
等于7 0 0 0。这正是阿拉伯数字系统的“魅力”所在,无论你进行多长的十进制的加法,只要
根据一种方法将问题分成几步即可。每一步最多只是将两个一位数字相加,这也是很久以前
有人强迫你记加法表的原因:
从最上边的一行和最左边的一列找到要相加的两个数字,在行与列的交叉点上找到它们
相加的结果。例如, 4加上6等于1 0。
同样,做两个十进制数相乘的运算时,方法可能稍稍复杂一点儿,但仍然只需将问题分
成几步,这样就不会比做加法和一位数的乘法更复杂了。你在小学时可能也必须记住下面的
乘法表:下载
第 7章 十进制记数法
35
与位置相关的记数系统的优点不在于它多么好用,而在于当它用在不是十进制的系统中
时,也一样的好用。我们现在用的数字系统不一定适合所有的人。十进制数字系统的一个很
大问题就在于它和卡通人物没有任何关系。大多数的卡通人物每只手上只有 4个手指,因此它
们喜欢基于 8的数字系统(八进制)。有趣的是,我们所知的大部分关于十进制数的知识同样
可以用于卡通朋友所喜爱的八进制数字系统中。下载
第8章 其他进位制记数法
1 0对我们来说是一个非常重要的数字。 1 0是我们大多数人拥有的手指或脚趾的数目,我
们当然希望所有人的手指脚趾都是 1 0个。因为我们的手非常适合数数,因而我们人类已经适
应了以1 0为基础的数字系统:
前面数章已经提到过,通常使用的数字系统称为以 1 0为基础的数字系统或十进制。这个
数字系统对我们来说非常自然,因而我们很难想像出还有其他的数字系统。事实上,当我们
看到数字1 0的时候,不由自主地就会认为这个数是指下面这么多只鸭子:
但是,数字1 0是指这么多只鸭子的唯一理由是因为这么多只鸭子与我们的手指数目相同。
如果人类不是有那么多只手指,我们数数的方式就会有所不同,数字 1 0就可能代表别的东西
了。同样是数字 1 0,可以指这么多只鸭子:
或这么多只鸭子:
甚至可以是这么多只鸭子:
当我们明白了 1 0可以指只有两只鸭子的时候,也就可以解释开关、电线、灯泡、继电器
(或干脆就叫计算机)是怎样表示数字的了。下载
第8章 其他进位制记数法
37
如果人类像卡通人物那样,每只手上只有 4个手指会怎样呢?我们可能永远都不会想到要
发明一种以 1 0为基础的数字系统的问题,取而代之的是我们可能会认为数字系统基于 8是正常、
自然、合理、必然的,是毫无疑问的,是非常合适的。这时,就不能称之为十进制了,得将
它称作为以 8为基础的数字系统或八进制。
如果数字系统是以 8为基础组织起来的,就不需要这样的一个符号:
把这个符号拿给任何一个卡通人物看,都会有同样的反应:“那是什么?它是干什么用
的?”如果再仔细想一会儿的话,你会发现连这样的一个字符也不需要:
在十进制数字系统中,没有专门用来表示 1 0的符号,所在在八进制数字系统中,也没有
专门用来表示1 0的符号。
在十进制数字系统中数数的方式是 0、1、2、3、4、5、6、7、8、9,然后是 1 0。在八进
制数字系统中数数的方式是 0、1、2、3、4、5、6、7,然后是什么呢?我们已经没有符号可
用了,唯一的一个有意义的可用符号是 1 0,的确是那样。在八进制数中, 7之后紧接着的数字
是1 0,但是 1 0并不是指人类的手指那么多的数目。在八进制数中, 1 0指的是卡通人物手指的
数目:
继续数脚趾头:
使用非十进制的数字系统时,将数字“ 1 0”读作“么零”可以避免一些混淆。同样,
“1 3”
可以读作“么三”,“2 0”可以读作“二零”。要想真正避免混淆,可以将“ 2 0”读作“八进制
二零”或“基于 8的数二零”。
即使没有手指和脚趾帮忙,我们仍能够将八进制数继续数下去。除了要跳过那些含有 8或
9的数字以外,它基本上和数十进制的数是一样的。当然,相同的数字代表的数量是不同的:38
编码的奥秘
下载
0、1、2、3、4、5、6、7、1 0、11、1 2、1 3、1 4、1 5、1 6、1 7、
2 0、2 1、2 2、2 3、2 4、2 5、2 6、2 7、3 0、3 1、3 2、3 3、3 4、3 5、3 6、3 7、4 0、
4 1、4 2、4 3、4 4、4 5、4 6、4 7、5 0、5 1、5 2、5 3、5 4、5 5、5 6、5 7、6 0、6 1、6 2、
6 3、6 4、6 5、6 6、6 7、7 0、7 1、7 2、7 3、7 4、7 5、7 6、7 7、1 0 0 . . .
最后一个数字读作“么零零”,是卡通人物拥有的手指数自乘的结果(即平方)。
在写十进制或八进制数时,为避免混淆,可以借助使用特定的标记以区别表示数字系统。
下面用标记“T E N”表示十进制数,标记“ E I G H T”表示八进制数。
这样,白雪公主遇到的小矮人的数目是 7 T E N 或7 E I G H T
卡通人手的手指数是 8 T E N 或1 0 E I G H T
贝多芬写的交响乐的首数是 9 T E N 或11 E I G H T
人的手指的数目是 1 0 T E N 或1 2 E I G H T
一年中的月份数是 1 2 T E N 或1 4 E I G H T
两个星期所包含的天数是 1 4 T E N 或1 6 E I G H T
“情人”的生日庆祝会是 1 6 T E N 或2 0 E I G H T
一天中所包含的小时数是 2 4 T E N 或3 0 E I G H T
拉丁字母表中的字符数是 2 6 T E H 或3 2 E I G H T
与一夸脱液体相当的盎司数为 3 2 T E N 或4 0 E I G H T
一副牌中含有的牌数是 5 2 T E N 或6 4 E I G H T
国际象棋棋盘的方格数是 6 4 T E N 或1 0 0 E I G H T
Sunset Strip 最著名的1 7牌号是7 7 T E N or 11 5 E I G H T
美式足球场的面积是 1 0 0 T E N 或1 4 4 E I G H T
参加温布尔登网球公开赛女单初赛的人数是 1 2 8 T E N 或2 0 0 E I G H T
古埃及孟斐斯城市面积的平方英里数是 2 5 6 T E N or 400 E I G H T
注意,在上面一系列的八进制数中,有一些好整数,像 1 0 0 E I G H T 、2 0 0 E I G H T 、 4 0 0 E I G H T 。好整
数通常是指结尾有一些零的数。在结尾处有两个零的十进制数意味着它是 1 0 0 T E N 即1 0 T E N 乘以
1 0 T E N ;在八进制数中,结尾处有两个零表示它是 1 0 0 E I G H T 即1 0 E I G H T 乘以1 0 E I G H T (或8 T E N 乘以8 T E N ,
等于6 4 T E N )。
你可能已经注意到了,好的八进制整数 1 0 0 E I G H T 、2 0 0 E I G H T 和4 0 0 E I G H T 与十进制数6 4 T E N 、128
T E N

2 5 6 T E N 相等,它们都是 2的整数次幂。例如, 4 0 0 E I G H T 等于4 E I G H T 乘以1 0 E I G H T 乘以1 0 E I G H T ,所有这些
数都是 2的整数次幂。任何时候,将 2的整数次幂和另一个 2的整数次幂相乘,得到的仍是 2的
整数次幂。
下表给出了一些 2的整数次幂的十进制及其对应的八进制的表示形式:
2的整数次幂
2 0
2 1
2 2
2 3
2 4
2 5
2 6
十进制数
1
2
4
8
1 6
3 2
6 4
八进制数
1
2
4
1 0
2 0
4 0
1 0 0第8章 其他进位制记数法
下载
39
(续)
2
2 8
2 9
2 1 0
2 11
2 1 2
7
1 2 8
2 5 6
5 1 2
1 0 2 4
2 0 4 8
4 0 9 6
2 0 0
4 0 0
1 0 0 0
2 0 0 0
4 0 0 0
1 0 0 0 0
最右边一列的好整数给我们一个暗示:十进制以外的数字系统可能对使用二元码有所帮
助。
八进制数字系统和十进制数字系统在结构上没有什么差别,只是在细节上有一些差异。
例如,八进制数的每一个位置代表的值是该位数字乘以 8的整数次幂的结果:
1的个数
8的个数
64的个数
512的个数
4096的个数
32768的个数
这样,八进制数 3 7 2 5 E I G H T 可以拆分成这样:
3 7 2 5 E I G H T = 3000 E I G H T + 700 E I G H T + 20 E I G H T + 5 E I G H T
还可以写成另外几种不同的形式。下面就是其中的一种,采用十进制形式的 8的整数次幂:
3 7 2 5 E I G H T = 3×5 1 2 T E N +
7×6 4 T E N +
2×8 T E N +
5×1
采用八进制形式的 8的整数次幂的情况:
3 7 2 5 E I G H T = 3×1 0 0 0 E I G H T +
7×1 0 0 E I G H T +
2×1 0 E I G H T +
5×1
还有另外的一种拆分形式:
3 7 2 5 E I G H T = 3×8 3 +
7×8 2 +
2×8 1 +
5×8 0
如果算出其十进制的结果,会得到 2 0 0 5 T E N 。这就是将八进制数转换成十进制数的方法。
可以采用与做十进制加法和乘法相同的办法来做八进制数的加法和乘法。唯一真正的区别
在于要采用不同的表格来对各个数字进行乘法或加法运算。下面是八进制数的加法表:40
编码的奥秘
下载
例如,5 E I G H T + 7 E I G H T = 14 E I G H T 。可以采用与做十进制加法相同的方法将两个稍长一点儿的
八进制数相加:
1 3 5
+ 643
1 0 0 0
先从最右边的一列做起, 5加上3等于1 0,该位写下 0,向前进 1;1加3加4等于1 0 ,该位写
下0,向前进1;1加1加6等于1 0。
同样,在八进制中, 2乘以2仍然等于 4。但是 3乘以3却不等于 9,那是多少呢? 3乘以3等
于11 E I G H T ,此数与9 T E N 所代表的数量相等。下图是完整的八进制数的乘法表:
这里,4×6等于3 0 E I G H T ,也即表明 3 0 E I G H T 和4×6的十进制结果2 4 T E N 是等值的。
八进制数字系统与十进制数字系统一样,都是有效的,但八进制数字系统在理解上更深
了一层。既然我们已为卡通人物开发出了一套数字系统,就再给龙虾开发一套适合它们用的
数字系统吧。龙虾根本没有手指,但它两只前爪的末端都有螯。适合于龙虾的数字系统是四第8章 其他进位制记数法
下载
41
进制数字系统或称为基于 4的数字系统:
四进制数可以这样来数:
0、1、2、3、1 0、11、1 2、1 3、2 0、2 1、2 2、2 3、3 0、3 1、3 2、3 3、1 0 0、1 0 1、1 0 2、
1 0 3、11 0,等等。
这里不打算在四进制数上花太多的时间,因为还有更重要的事情要做。但我们还是要看
一下四进制中的每一位是怎样和 4的某个整数次幂相对应的:
1的个数
4的个数
16的个数
64的个数
256的个数
1024的个数
四进制数3 1 2 3 2可以写成:
3 1 2 3 2 F O U R = 3×2 5 6 T E N +
1×6 4 T E N +
2×1 6 T E N +
3×4 T E N +
2×1 T E N
也可以写成:
3 1 2 3 2 F O U R = 3×1 0 0 0 0 F O U R +
1×1 0 0 0 F O U R +
2×1 0 0 F O U R +
3×1 0 F O U R +
2×1 F O U R
还可以写成:
3 1 2 3 2 F O U R = 3×4 4 +
1×4 3 +
2×4 2 +
3×4 1 +
2×4 042
编码的奥秘
下载
如果以十进制数的形式计算其结果,就会发现 3 1 2 3 2 F O U R 等于8 7 8 T E N 。
现在,我们要做一个跳跃并且是最远的一跳。假定我们是海豚,并且必须用两鳍来数数。
则这个数字系统就是基于 2的数字系统或二进制的。这样似乎只需要两个数字,即 0和1。
现在, 0和1已是你要处理的全部问题,需要练习一下才能习惯使用二进制数。二进制数
最大的问题是数字用完得很快。例如,下图是海豚怎样用它的鳍数数的例子:
是的,在二进制中,1后面的数字是1 0。这是令人惊讶的,但也并不奇怪。无论使用哪种数
字系统,当单个位的数字用完时,第一个两位数字都是1 0。在二进制系统中,可以这样来数数:
0、1、1 0、11、1 0 0、1 0 1、11 0、111、1 0 0 0、1 0 0 1、1 0 1 0、
1 0 11、11 0 0、11 0 1、111 0、1111、1 0 0 0 0、1 0 0 0 1、......
这些数看起来好像很大,实际上并不是这样。更准确地说二进制数长度增长的速度要快
过二进制数增大的速度:
每个人的头的个数为 1 T E N 或1 T W O
海豚身上的鳍的个数为 2 T E N 或1 0 T W O
一个大汤匙中包括的小茶匙的数目为 3 T E N 或11 T W O
正方形的边数为 4 T E N 或1 0 0 T W O
每个人一只手的手指数为 5 T E N 或1 0 1 T W O
一种昆虫的腿数为 6 T E N 或11 0 T W O
一星期的天数为 7 T E N 或111 T W O
八重奏中音乐家的个数为 8 T E N 或 1 0 0 0 T W O
太阳系中的行星(包括冥王星在内)总数为 9 T E N 或1 0 0 1 T W O
牛仔帽重量以加仑计算为 1 0 T E N 或1 0 1 0 T W O
等等。
在多位二进制数中,数字的位置和 2的整数次幂的对应关系为:
1的个数
2的个数
4的个数
8的个数
16的个数
32的个数
因此,任何时候由一个 1后跟几个零构成的二进制数一定是 2的整数次幂。 2的幂与二进制43
第8章 其他进位制记数法
下载
数中零的个数相等。下面是扩充的 2的各次幂的表,可用来说明这条规则:
2的幂
十进制数
八进制数
四进制数
二进制数
0 1 1 1 1
2 1 2 2 2 1 0
2 2 4 4 1 0 1 0 0
2 3 8 1 0 2 0 1 0 0 0
2 4 1 6 2 0 1 0 0 1 0 0 0 0
2
5 3 2 4 0 2 0 0 1 0 0 0 0 0
2 6 6 4 1 0 0 1 0 0 0 1 0 0 0 0 0 0
2 7 1 2 8 2 0 0 2 0 0 0 1 0 0 0 0 0 0 0
2 8 2 5 6 4 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0
2 9 5 1 2 1 0 0 0 2 0 0 0 0 1 0 0 0 0 0 0 0 0 0
2 1 0 1 0 2 4 2 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
2
2 11 2 0 4 8 4 0 0 0 2 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
2 1 2 4 0 9 6 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
假定有一个二进制数 1 0 11 0 1 0 11 0 1 0,它可以写成:
1 0 11 0 1 0 11 0 1 0 T W O = 1×2 0 4 8 T E N +
0×1 0 2 4 T E N +
1×5 1 2 T E N +
1×2 5 6 T E N +
0×1 2 8 T E N +
1×6 4 T E N +
0×3 2 T E N +
1×1 6 T E N +
1×8 T E N +
0×4 T E N +
1×2 T E N +
0×1 T E N
也可以这样写:
1 0 11 0 1 0 11 0 1 0 TWO = 1×2 11 +
0×2 1 0 +
1×2 9 +
1×2 8 +
0×2 7 +
1×2 6 +
0×2 5 +
1×2 4 +
1×2 3 +
0×2 2 +
1×2 1 +
0×2 044
编码的奥秘
下载
如果将各个部分以十进制数的形式相加,得到 2 0 4 8 + 5 1 2 + 2 5 6 + 6 4 + 1 6 + 8 + 2=2 9 0 6 T E N 。
将二进制数转换成十进制数非常简单,你可能更喜欢借助已准备好的模板进行转换:
×128
×64
×32
×16
×8
×4
×2
×1
这个模板允许你转换最大长度为 8的二进制数,但它扩充起来非常容易。使用时,将 8个
二进制数字放到上部的 8个小盒子中,一个盒子放一个数字。做 8个乘法运算,将结果分别放
到底部的 8个小盒子中。将 8个盒子中的数字相加就得到最终结果。下面是将 1 0 0 1 0 11 0转化成
十进制数的例子:
×128
×64
×32
×16
×8
×4
×2
×1
将十进制数转换成二进制数就没那么直接了。但这里也有一个帮助你将 0~2 2 5范围内的
十进制数转换成二进制数的模板:
实际转化过程要表面上看的麻烦得多,所以一定要仔细按照下面的指导来做。将整个十
进制数(应小于等于 2 2 5)放在左上角的方格中。用除数( 1 2 8)去除那个数(被除数),如下
图所示。将商写在正下方的盒子中(即左下角的盒子中),余数写在右边的盒子中(即上面一
行左数第二个盒子中)。用第一个余数再除以下一个算子 6 4。依照模板的顺序用同样的方法继
续做下去。
记住,每次求得的商只能是 0或者1。如果被除数小于除数,商为 0,余数和被除数相等;
如果被除数大于除数,商为 1,余数为被除数与除数之差。下面是将 1 5 0转换成二进制数的过
程:
如果要做两个二进制数的加法或乘法,也许直接采用二进制来做比转化成十进制再做还
要简单。这将是你真正喜欢二进制数的地方。如果只需记住下面的二进制加法表就可以做加
法运算,也就不难想象掌握加法运算该有多快:
+ 0 1
0
1 0
1 1
1 0
用二进制加法表将两个二进制数相加:第8章 其他进位制记数法
下载
45
1 1 0 0 1 0 1
+ 0 1 1 0 1 1 0
1 0 0 1 1 0 1 1
从最右边的一列开始做起:1加上0等于1;右数第 2列:0加上1等于1;第3列:1加上1
等于0,进位为1;第4列:1(进位值)加上 0再加上0等于1;第5列:0加上1等于1;第6列:1
加1等于0,进位为1;第7列:1(进位值)加上 1再加上0等于1 0。
乘法表比加法表更简单,因为该表可以由两个基本的乘法规则推导出来:零乘以任何数
都等于0,1与任何数相乘仍是那个数本身:
× 0 1
0 0 0
1 0 1
下面是1 3 T E N 与11 T E N 以二进制数的形式做乘法的过程:
1 1 0 1
× 1 0 1 1
1 1 0 1
1 1 0 1
0 0 0 0
1 1 0 1
1 0 0 0 1 1 1 1
最后结果是 1 4 3 T E N 。
人们在使用二进制数的时候通常将它们写成带有前导零的形式(即第一个 1的左边有零)。
例如, 0 0 11而不写成 11。这些零不会改变数字的值,只是起到一些装饰作用。例如,下面是
二进制的前 1 6个数以及和它们等值的十进制数:
二进制数 十进制数
0 0 0 0
0 0 0 1
0 0 1 0
0 0 11
0 1 0 0
0 1 0 1
0 11 0
0 111
1 0 0 0
1 0 0 1
1 0 1 0
1 0 11
11 0 0
11 0 1
111 0
1111 0
1
2
3
4
5
6
7
8
9
1 0
11
1 2
1 3
1 4
1 5
让我们再仔细看看这些二进制数字。考虑一下这 4个垂直列中每一列的 0和1,注意它们在
一列中自上而下是以怎样的规律变化的:46
编码的奥秘
下载
• 最右边一列一直在 0和1之间相互替换。
• 右数第2列在两个0和两个1之间相互替换。
• 右数第3列在四个0和四个1之间相互替换。
• 右数第4列在八个0和八个1之间相互替换。
这是很有规律的,难道不是吗?事实上,只要再重复这 1 6个数字并且在每个数字的前面
放一个1就可以很容易地写出后面的 1 6个数字:
二进制数 十进制数
1 0 0 0 0
1 0 0 0 1
1 0 0 1 0
1 0 0 11
1 0 1 0 0
1 0 1 0 1
1 0 11 0
1 0 111
11 0 0 0
11 0 0 1
11 0 1 0
11 0 11
111 0 0
111 0 1
1111 0
11111 1 6
1 7
1 8
1 9
2 0
2 1
2 2
2 3
2 4
2 5
2 6
2 7
2 8
2 9
3 0
3 1
下面是看待这些数字的另一种方式:在数二进制数的时候,最右边的数字(也称最低位
数字)是在 0和1之间变化的。当它每次从 1变到0时,右数第二位数字(也称次低位数字)也
要发生变化,或者从 0变到1,或者从 1变到0。每次只要有一个二进制数位的值由 1变到0,紧
挨着的高位数字也会发生变化,要么从 0变到1,要么从1变到0。
我们在写十进制中比较大的数字时,通常每三个数字之间留一点儿空隙,这样,我们一
看就知道这个数的大概数值。例如,当你看到数字 1 2 0 0 0 0 0 0时,你可能不得不去数其中 0的个
数,但如果看到的是 12 000 000,则马上就能知道是一亿两千万。
二进制数的位长度增加得特别快。例如,一亿两千万的二进制表示为:
1 0 11 0 111 0 0 0 11 0 11 0 0 0 0 0 0 0 0。为了让它更易读,通常是每四个数字之间用连字符或空格来分
开。例如; 1 0 11 - 0 111 - 0 0 0 1 - 1 0 11 - 0 0 0 0 - 0 0 0 0或1 0 11 0 111 0 0 0 11 0 11 0 0 0 0 0 0 0 0。本书的后面会讲
到更简单的二进制数的表示方法。
通过将数字系统减少至只有 0和1两个数字的二进制数字系统,我们已经在能够接受的范
围内做了深入的讨论。不可能找到比二进制数字系统更简单的数字系统了。二进制数字系统
架起了算术与电之间的桥梁。前面各章中,我们所看到的开关、电线、灯泡、继电器等物体
都可以表示二进制数 0和1:
电线可以表示二进制数字。有电流流过电线代表二进制数字 1;如果没有,则代表二进制
数字0。
开关可以表示二进制数字。如果开关闭合,代表二进制数字 1;如果开关断开,代表二进
制数字0。
灯泡可以表示二进制数字。如果灯泡亮着,代表二进制数字 1;如果没亮,代表二进制数下载
第8章 其他进位制记数法
47
字0。
电报继电器可以表示二进制数字。继电器闭合,代表二进制数字 1;继电器断开,代表二
进制数字0。
二进制数与计算机密切相关!
大约在1 9 4 8年,美国数学家 John Wilder Tukey (生于1 9 1 5年)提前认识到二进制数将在
未来几年中随着计算机的流行而发挥更大的作用。他决定创造一个新的、更短的词来代替使
用起来很不灵活的五音节词 — binary digit。他曾经考虑用 b i g i t或b i n i t,但最后还是选用了短
小、简单、精巧且非常可爱的单词 b i t (比特)来代替binary digit这个词。下载
第9章 二 进 制 数
1 9 7 3年,当安东尼・奥兰多在他写的一首歌中要求他挚爱的人“系一条黄色的绸带在橡
树上”时,他并没有要求他的爱人进行繁琐的解释或冗长的讨论,只要求她给他一个简单的
结果。他不去关心其中的因果,即使歌中复杂的感情和动情的历史在现实生活中重演,所有
的人真正想知道的仅仅是一个简单的是或不是。他希望在树上系一条黄色的绸带来表示:“是
的,即使你犯了很大的错,并且被判了入狱三年,我仍希望你回来和我一起共渡时光。”他希
望用树上没有黄色的绸带来表示:“你连停在这里都别想。”
这是两个界线分明、相互排斥的答案。奥兰多没有这样唱:“如果你想再考虑一下的话,
就系半条黄色的绸带”或者“如果你不爱我但仍希望我们是朋友,就系一条蓝色的绸带吧”。
相反,他让答案非常的简单。
和黄色绸带的有无具有同样效果的另外几个例子(但可能无法用在诗里)是可以选择一
种交通标记放在院外,可能是“请进”或 “此路不通”。
或者在门上挂一个牌子,上写“关”或“开”。
或者用从窗口能够看到的一盏灯的亮灭来表示。
如果你只需说“是”或“不是”的话,可以有很多种方式来表达。你不必用一个句子来
表达是或不是,也不需要一个单词,甚至连一个字母都不要。你只要用一个比特,即只要一
个0或1即可。
正如我们在前面的章节中所了解到的,通常用来计数的十进制数事实上并没有什么与众
不同的地方。非常清楚,我们的数字系统之所以是基于 1 0的(十进制数)是因为我们有 1 0个
手指头。我们同样有理由使用八进制数字系统(如果我们是卡通人物)或四进制数字系统
(如果我们是龙虾),甚至是二进制数字系统(如果我们是海豚)。
但是,二进制数字系统有一点儿特别:它可能是最简单的数字系统。二进制数字系统中
只有两种二进制数字 — 0和1。要是我们想寻求更简单的数字系统,只好把数字 1去掉,这样,
就只剩下0一个数字了。只有一个数字 0的数字系统是什么都做不成的。
“b i t (比特)”这个词被创造出来代表“ binary digit”,它的确是新造的和计算机相关的最可
爱的词之一。当然,“b i t”有其通常的意义:“一小部分,程度很低或数量很少”。这个意义用
来表示比特是非常精确的,因为 1比特 — 一个二进制数字位 — 确实是一个非常小的量。
有时候当一个新词诞生时,它还包含了一种新的意思。 b i t这个词也是这样。 1比特的意思
超过了被海豚用来数数的二进制数字位所包含的意义。在计算机时代,比特已经被看作是组
成信息块的基本单位。
当然,上述说法不一定完全正确,比特并不是传送信息的唯一的方式。字母、单词、摩
尔斯码、布莱叶盲文,十进制数字都可以用来传递信息。比特传递的信息量很小。 1比特只具
备最少的信息量,更复杂的信息需要多位比特来传递。(我们说比特传递的信息量小,并不是
说它传送的信息不重要。事实上黄绸带对于与它相关的两个人来说是一个非常重要的信息。)
“听,孩子们,你们很快就能听到 Paul Revere 午夜的马蹄声。”享利・朗费罗写道。尽管第9章 二 进 制 数
下载
49
他在描述 Paul Revere是怎样通知美国人英国殖民者入侵的消息时不一定与史实完全一致,但
他的确提供了一个利用比特传递信息的令人茅塞顿开的例子:
(他告诉他的朋友:“如果英军今晚入侵,
你就在北教堂的钟楼拱门上悬挂点亮的提灯
作为信号。一盏提灯代表英军由陆路入侵,
两盏提灯代表英军由海路入侵。...... )
也就是说,Paul Revere 的朋友有两盏灯。如果英军由陆路入侵,他就挂一盏灯在教堂的
钟楼上;如果英军由海路入侵,他就挂两盏灯在教堂的钟楼上。
然而,朗费罗并没有将所有的可能都涉及到。他留下第三种情况没有说,那就是英军根
本就没有入侵的情况。朗费罗已经暗示第三种可能的信息可以由不挂提灯的方式来传递。
让我们假设那两盏灯是永久固定在教堂钟楼上的。在正常情况下,它们都不亮:
这就是指英军还没有入侵。如果一盏提灯亮:

表示英军正由陆路入侵。如果两盏提灯都亮:50
编码的奥秘
下载
表示英军正由海路入侵。
每一盏提灯都代表一个比特。亮着的灯表示比持值为 1,未亮的灯表示比特值为 0。前面
奥兰多已经说明了传送只有两种可能性的信息只需要一个比特。如果 Paul Revere只需被告知
英军正在入侵(不管是从何处入侵)的消息,一盏提灯就足够了。点亮提灯代表英军入侵,
未点亮提灯代表又是一个和平之夜。
传递三种可能性的消息还需要再有一盏提灯。一旦再有一盏提灯,两个比特就可以通知
有四种可能的信息:
0 0 =英军今晚不会入侵
0 1 =英军正由陆路入侵
1 0 =英军正由陆路入侵
11 =英军正由海路入侵
Paul Revere将三种可能性用两盏提灯来传送的做法事实上是相当富有经验的。用通信理
论的术语说,他采用了冗余的办法来降低噪声的影响。通信理论中的噪声是指影响通信效果
的任何事物。电话线路中的静电流显然是影响电话通信的一种噪声。然而,即使是在有噪声
的情况下,电话通信仍能够成功,因为口语中存在大量的冗余。你同样可以听懂对方的话而
无需将每个音节、每个字都听得很清楚。
在上述例子中,噪声是指晚上光线黯淡以及 Paul Revere 距钟楼有一定的距离,它们都阻
碍了Paul Revere声将钟楼上的两盏灯区分清楚。下面是朗费罗的诗中很重要的一段:
(哦!他站在与钟楼等高的位置观察,
一丝微光,然后,有一盏灯亮了!
他跳上马鞍,调转马头,
徘徊,凝视,直到看清所有的灯
另一盏灯也亮了!)
那当然不是说Paul Revere正在辨清到底是哪盏灯先亮的问题。
这里最本质的概念是信息可能代表两种或多种可能性的一种。例如,当你和别人谈话时,
说的每个字都是字典中所有字中的一个。如果给字典中所有的字从 1开始编号,我们就可能精
确地使用数字进行交谈,而不使用单词。(当然,对话的两个人都需要一本已经给每个字编过
号的字典以及足够的耐心。)
换句话说,任何可以转换成两种或多种可能的信息都可以用比特来表示。不用说,人类
使用的很多信息都无法用离散的可能性来表示,但这些信息对我们人类的生存又是至关重要
的。这就是人类无法和计算机建立起浪漫关系的原因所在(无论怎样,都希望这种情况不会
发生)。如果无法将某些信息以语言、图片或声音的形式表达,那也不可能将这些信息以比特
的形式编码。当然,你也不会想将它们编码。
举手或不举手是一个比特的信息。两个人是否举手 —就像电影评论家 Roger Ebert和刚去第9章 二 进 制 数
下载
51
世不久的 Gene Siskel对新影片提供他们最终的评价结果那样 — 传递两个比特的信息。(我们
将忽略掉他们实际上对影片做的评语,而只关心他们有没有举手的问题。)这样,我们用两个
比特代表四种可能:
00 = 他们都不喜欢这部影片
01 = Siskel 讨厌它,E b e r t喜欢它
10 = Siskel 喜欢它,E b e r t讨厌它
11 = Siskel和E b e r t都喜欢它
第一个比特值代表 S i s k e l的意见, 0表示S i s k e l讨厌这部影片, 1表示S i s k e l喜欢这部影片。
同样,第二个比特值代表 E b e r t的意见。
因此,如果你的朋友问你 S i s k e l和E b e r t是怎么评价《Impolite Encounter》这部电影的,你
不用回答“S i s k e l举手了,E b e r t没有举手”或者“S i s k e l喜欢这部电影,E b e r t不喜欢这部电影”,
你可以简单地回答“么零”。你的朋友只要知道哪一位代表的是 S i s k e l的意见,哪一位代表的
是E b e r t的意见,并且知道值为 1代表举手,值为 0代表没有举手,你的回答就是可以被人理解
的。当然,你和你的朋友都要知道这种代码的含义。
我们也可以一开始就声明值为 1的比特位表示没有举手,值为 0的比特位表示举手了,这
可能有点违反常规。通常我们会认为值为 1的比特位代表正面的事情,而值为 0的比特位代表
相反的一方面,这的确只是一种很随意的指派。无论怎样,用此种代码的人只要明白 0、1分
别代表什么就可以了。
某一位或几位比特位的集合所代表的意义通常是和上下文相关的。橡树上的黄绸带可能
只有系绸带的人和期望看到绸带的人知道其中的意思,改变绸带的颜色、系绸带的树或系绸
带的日期,绸带可能会被认为只是一块毫无意义的破布。同样,要从 S i s k e l和E b e r t的手势中
得到有用的信息,我们至少要知道正在讨论的是哪部影片。
如果你保存了 S i s k e l和E b e r t对一系列影片的评价和投票结果,你就有可能在表示 S i s k e l和
E b e r t意见的比特信息中再增加一位代表你自己的观点的比特位。增加的第三位使得其代表的
信息可能性增加到 8种:
000 = Siskel讨厌它,E b e r t讨厌它,我讨厌它
001 = Siskel讨厌它,E b e r t讨厌它,我喜欢它
010 = Siskel讨厌它,E b e r t喜欢它,我讨厌它
0 11 = Siskel讨厌它,E b e r t喜欢它,我喜欢它
100 = Siskel喜欢它,E b e r t讨厌它,我讨厌它
101 = Siskel喜欢它,E b e r t讨厌它,我喜欢它
110 = Siskel喜欢它,E b e r t喜欢它,我讨厌它
111 = Siskel喜欢它,E b e r t喜欢它,我喜欢它
使用比特来表示信息的一个额外好处是我们清楚地知道我们解释了所有的可能性。 我们
知道有且仅有 8种可能性,不多也不少。用 3个比特,我们只能从 0数到7,后面再没有 3位二进
制数了。
在描述 S i s k e l和E b e r t的比特时,你可能一直在考虑一个严重的,并且是令人烦恼的问题
— 对于Leonard Maltin的Movie &Video Guide怎么办呢?别忘了, Leonard Maltin是不采用举52
编码的奥秘
下载
手表决这种形式的,他对电影的评价用的是更传统的星级系统。
要想知道需多少个 M a l t i n比特,首先要了解一些关于 M a l t i n评分系统的知识。 M a l t i n给电
影的评价是1~4颗星,并且中间可以有半颗星。(仅仅是为了好玩,他实际上不会给电影只评
一颗星,取而代之的是给一个 B O M B[炸弹]。)这里总共有七种可能性,也就是说只需要 3
个比特位就可以表示一个特定的评价等级了:
000 = BOMB
001 = ★1 / 2
010 = ★★
0 11 = ★★1 / 2
100 = ★★★
101 = ★★★1 / 2
110 = ★★★★
你可能会问 111怎么办呢, 111这个代码什么意义都没有,它没有定义。如果二进制代码
111被用来表示 M a l t i n等级,那一定是出现错误了。(这可能是计算机出的错误,因为人不会给
出这样的评分。)
前面我们曾用两个比特来代表 S i s k e l和E b e r t的评价结果,左边的一位代表 S i s k e l的评价意
见,右边的一位代表 E b e r t的评价意见。在上述 M a l t i n评分系统中,各个比特位都有确定的意
义吗?是的,当然有。将比特编码的数值加 2再除以 2,就得到了 M a l t i n评分中对应的星的颗
数。这样编码是由于我们在定义代码时遵循了合理性和连贯性,我们也可以下面的这种方式
编码:
0 0 0 =★★★
0 0 1 =★1 / 2
0 1 0 =★★1 / 2
0 11 =★★★★
1 0 1 =★★★1 / 2
11 0 =★★
111 = B O M B
只要大家都了解代码的含义,这种表示就和前述代码一样,都是合理的。
如果M a l t i n遇到了一部连一颗星都不值得给的电影,他就会给它半颗星。他当然有足够的
代码来表示半颗星的情况,代码会像下面这样定义:
000=MAJOR BOMB
0 0 1 = B O M B
0 1 0 =★1 / 2
0 11 =★★
1 0 0 =★★1 / 2
1 0 1 =★★★
11 0 =★★★1 / 2
111 =★★★★第9章 二 进 制 数
下载
53
但是,如果他再遇到连半颗星的级别都不够的影片并且决定给它没有星的级别( ATO M I C
B O M B?)
,他就得再需要一个比特位了,已经没有 3个比特的代码空闲了。
《Entertainment We e k l y》杂志常常给事物定级,除了电影之外还有电视节目、 C D、书籍、
C D - R O M、网络站点等等。等级的范围从 A +~F,如果你数一下的话,发现共有 1 3个等级。
这样,需要四个比特来代表这些等级:
0000 = F
0001 = D-
0010 = D
0 0 11 = D+
0100 = C-
0101 = C
0 110 = C+
0 111 = B-
1000 = B
1001 = B+
1010 = A-
1 0 11 = A
1100 = A+
有3个代码没有用到,它们是: 11 0 1、111 0和1111,加上后总共是 1 6个代码。
只要谈到比特,通常是指特定数目的比特位。拥有的比特位数越多,可以传递的不同可
能性就越多。
对十进制数当然也是同样的道理。例如,电话号码的区号有几位呢?区号共有 3位数字。
如果所有的区号都使用的话(实际上有一部分区号并没有使用,将它们忽略),一共有 1 0 3 或
1 0 0 0个代码,从0 0 0~9 9 9。区号为 2 1 2的7位数的电话号码有多少种可能呢? 1 0 7 或10 000 000
个;区号为 2 1 2并且以2 6 0开头的电话号码有多少个呢? 1 0 4或10 000个。
同样,在二进制数中,可能的代码数等于 2的比特位数次幂:
比特位数
1
2
3
4
5
6
7
8
9
1 0
代码数
2 1 = 2
2 2 = 4
2 3 = 8
2 4 = 16
2 5 = 32
2 6 = 64
2 7 = 128
2 8 = 256
2 9 = 512
2 1 0 = 1024
每增加一个比特位,二进制代码数翻一番。
如果知道需要多少个代码,那么怎样才能知道需要多少个比特位呢?换句话说,在上述
表中,如何才能由代码数反推出比特位数呢?
用到的方法叫作取以 2为底的对数,对数运算是幂运算的逆运算。我们知道 2的7次幂等于54
编码的奥秘
下载
1 2 8,以2为底的1 2 8的对数就等于7。用数学记号来表示第一个句子为:
2 7 = 128
它与下述句子等价:
l o g 2 128 = 7
因此,如果以 2为底的 1 2 8的对数等于 7,以2为底的 2 5 6的对数等于 8,那么,以 2为底的
2 0 0的对数等于多少呢?大约是 7 . 6 4,但实际上并不需要知道它。如果要表示 2 0 0种不同的事
物,我们共需要 8个比特。
比特通常无法从日常观察中找到,它深藏于电子设备中。我们看不到压缩磁盘 ( C D )、数
字手表或计算机中编过码的比特,但有时候比特也可以清晰地看到。
下面就是一个例子。如果你手头有一个使用 3 5毫米胶片的相机,观察一下它的卷轴。这
样拿住胶卷:
胶卷上有像国际跳棋棋盘一样的银色和黑色方格,方格已用数字 1~1 2标识。这叫作 D X
编码,这 1 2个方格实际上是 1 2个比特。一个银色的方格代表值为 1的比特,一个黑色的方格代
表值为0的比特。方格1和7通常是银色的(代表 1)。
这些比特是什么意思呢?你可能知道有些胶片对光的敏感程度要比其他胶片强,这种对
光的敏感程度称作胶片速度。说对光非常敏感的胶片很快是因为这种胶片的曝光速度快。曝
光速度是由 A S A(American standards association,美国标准协会)来制定等级的,最常用的
等级有1 0 0、2 0 0和4 0 0。A S A等级不只是以十进制数字的形式印在胶卷的外包装和暗盒上,而
且还以比特的形式进行了编码。
胶卷总共有 2 4个A S A等级,它们是:
2 5 3 2 40
5 0 6 4 8 0
1 0 0 1 2 5 1 6 0
2 0 0 2 5 0 3 2 0
4 0 0 5 0 0 6 4 0
8 0 0 1 0 0 0 1 2 5 0
1 6 0 0 2 0 0 0 2500
3 2 0 0 4 0 0 0 5 0 0 0
为A S A等级编码需要多少个比特呢?答案是 5个比特。我们知道, 2 4 = 1 6,与2 4比太小了;
2 5 = 32,又超过了所需的编码数。第9章 二 进 制 数
下载
55
比特值与胶片速度的对应关系如下所示:
方格2 方格3 方格4 方格5 方格6
0
0
0
1
1
1
0
0
0
1
1
1
0
0
0
1
1
1
0
0
0
1
1
1 0
0
0
0
0
0
1
1
1
1
1
1
0
0
0
0
0
0
1
1
1
1
1
1 0
0
0
0
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
1
1
1
1 1
0
1
1
0
1
1
0
1
1
0
1
1
0
1
1
0
1
1
0
1
1
0
1 0
1
1
0
1
1
0
1
1
0
1
1
0
1
1
0
1
1
0
1
1
0
1
1
胶片速度
2 5
3 2
4 0
5 0
6 4
8 0
1 0 0
1 2 5
1 6 0
2 0 0
2 5 0
3 2 0
4 0 0
5 0 0
6 4 0
8 0 0
1 0 0 0
1 2 5 0
1 6 0 0
2 0 0 0
2 5 0 0
3 2 0 0
4 0 0 0
5 0 0 0
多数现代的 3 5毫米照相机胶片用的都是这些代码(除了那些要手工进行曝光的相机和具
有内置式测光表但需要手工设置曝光速度的相机以外)。如果你看过照相机的内部放置胶卷的
地方,你应该能够看到和胶片的金属方格( 1~6号)相对应的 6个金属可接触点。银色方格实
际上是胶卷暗盒中的金属,是导体;油漆了的黑色方格,是绝缘体。
照相机的电子线路中有一支流向方格 1的电流,方格 1通常是银色的。这支电流有可能流
到方格 2~6,这要依方格中是纯银还是涂了油漆而定。这样,如果照相机在接触点 4和5检测
到了电流而在接触点 2、3和6没有检测到,胶片的速度就是 4 0 0 A S A。照相机可以据此调节曝
光时间。
廉价的照相机只要读方格 2和方格3,并且假定胶片速度是 5 0、1 0 0、2 0 0或4 0 0 A S A四种可
能速度之一。
多数相机不读方格 8~1 2。方格8、9、1 0用来对这卷胶卷进行编码;方格 11和1 2指出曝光
范围,依胶片用于黑白照片、彩色照片还是幻灯片而定。
也许最常见的二进制数的表现形式是无处不在的 U P C(universal product code,通用产品
代码),即日常所购买的几乎所有商品包装上的条形码。条形码已经成为计算机在日常生活中
应用的一种标志。
尽管U P C常常使人多疑,但它确实是一个无辜的小东西,发明出来仅仅是为了实现零售
业的结算和存货管理的自动化,且其应用是相当成功的。当它和一个设计精良的结算系统共
同使用时,顾客可以拿到列出细目的售货凭条,这一点是传统现金出纳员所无法做到的。
有趣的是, U P C也是二进制代码,尽管它初看起来并不像。将 U P C解码并看看 U P C码具56
编码的奥秘
下载
体是怎样工作的是很有益的。
通常情况下, U P C是3 0条不同宽度的垂直黑色条纹的集合,由不同宽度的间隙分割开,
其下标有一些数字。例如,以下是 C a m p b e l l公司1 0
3
4
盎司的罐装鸡汁面包装上的 U P C:
可将条形码形象地看成是细条和黑条,窄间隙和宽间隙的排列形式,事实上,这是观察条
形码的一种方式。黑色条有四种不同的宽度,较宽的条的宽度是最细条的宽度的两倍、三倍
或者四倍。同样,各条之间的间隙中较宽的间隙是最窄间隙的两倍、三倍或者四倍。
但是,看待 U P C的另一种方式是将它看作是一系列的比特。记住,整个条形码与条形码
扫描仪在结算台“看”到的并不完全一样。扫描仪不会识别条形码底部的数字,因为识别数
字需要一种更复杂的技术 — 光学字符识别技术,又称作O C R(optical character recognition )。
实际上,扫描仪只识别整个条形码的一条窄带,条形码做得很大是为了便于结算台的操作人
员用扫描仪对准顾客选购的物品。扫描仪所看到的那一条窄带可以这样表示:
它看上去是不是很像摩尔斯编码 ?
当计算机自左向右进行扫描时,它给自己遇到的第一个条分配一个值为 1的比特值,给与
条相邻的间隙分配一个值为 0的比特值。后续的间隙和条被当作一行中一系列比特中的 1个、2
个、3个还是 4个比特读进计算机要依据条或间隙的宽度而定。扫描进来的条形码的比特形式
很简单:
因此,整个U P C只是简单的由9 5个比特构成的一串。本例中,这些比特可以像下面这样分组:
比特
意义
最左边的护线
左边的数字
中间的护线
右边的数字
最右边的护线第9章 二 进 制 数
下载
57
起初的3个比特通常是 1 0 1,这就是最左边的护线,它帮助计算机扫描仪定位。从护线中,
扫描仪可以知道代表单个比特的条或间隙的宽度,否则,所有包装上的 U P C印刷大小都是一
样的。
紧挨着最左边的护线是每组有 7个比特位的六组比特串,每一组是数字 0~9的编码之一,
我们在后面将证明这一点。接着的是 5个比特的中间护线,此固定模式(总是 0 1 0 1 0)是一种
内置式的检错码。如果扫描仪在应当找到中间护线的地方没有找到它,扫描仪就认为那不是
U P C。中间护线是防止条形码被窜改或错印的方法之一。
中间护线的后面仍是每组 7个比特的 6组比特串。最后是最右边的护线,也总是 1 0 1。最后
的最右护线使得 U P C反向扫描(也就是自右向左扫描)同正向扫描一样成为可能,这一点我
们将在后面解释。
因而整个 U P C对1 2个数字进行了编码。左边的 U P C包含了6个数字的编码,每个数字占有
7个比特位。你可以用下表进行解码:
左边的编码
0 0 0 1101=0 011 0 0 0 1 = 5
0 0 11001=1 0101111 = 6
0 0 1 0 0 11=2 0111 0 11 = 7
0 111101=3 011 0 111 = 8
0 1 0 0 0 11=4 0001011 = 9
注意,每个 7位代码都是以 0开头,以 1结尾的。如果扫描仪遇到了第一个比特位值为 1或
最后一个比特位值为 0的情况,它就知道自己没有将 U P C正确地读入或者是条形码被窜改了。
另外我们还注意到每个代码都仅有两组连续的值为 1的比特位,这就意味着每个数字对应着条
形码中的两个竖条。
上表中的每个代码中都包含有奇数个值为 1的比特位,这也是用于检测差错和数据一致性
的一种机制,称为奇偶校验。如果一组比特位中含有奇数个 1,就称之为奇校验;如果含有偶
数个1,就称之为偶校验。这样看来,所有这些代码都拥有奇校验。
为了给U P S右边的7位一组的数字解码,可以采用下面的表格:
右边的编码
1110010=0 100111 0 = 5
11 0 0 110=1 1010000=6
11 0 1100=2 1000100=7
1000010=3 1001000=8
1 0 11100=4 111 0 1 0 0 = 9
这些代码都是前述代码的补码或补数:凡是 1的地方都换成 0,凡是 0的地方都换成 1。这
些代码都是以1开始,以零结束,并且每组都有偶数个 1,称之为偶校验。
现在,可以对 U C P进行解码了。借助前两个表格, C a m p b e l l公司1 0
的包装上用 U P C编码的1 2个数字是:
3
4
盎司的罐装鸡汁面
0 51000 01251 7
这个结果是令人失望的,正如你所看到的那样,它们和印在 U P C底部的数字完全相同。58
编码的奥秘
下载
(这样做是有意义的,因为由于某种原因,扫描仪可能无法识别条形码,收银员就可以手工将
这些数字输进去。)我们还没有完成解码的全部任务,而且,我们也无法从中解码任何秘密信
息。然而,关于 U P C的解码工作已经没有了,那 3 0个竖条已经变成了 1 2个数字。
第一个数字(在这里是 0)被称为数字系统字符, 0的意思是说这是一个规范的 U P C编码。
如果是具有不同重量的货物的 U P C(像肉类或其他商品),这个数字是 2;订单、票券的 U P C
编码的第一个数字通常是 5。
紧接着的 5个数字是制造商代码。在上例中, 5 1 0 0 0是 Campbell 鸡汁面公司的代码。
C a m p b e l l公司生产的所有产品都使用这个代码。再后面的 5个数字( 0 1 2 5 1)是该公司的某种
3
产品的编号,上例中是指 1 0 盎司的罐装鸡汁面。别的公司的鸡汁面可能有不同的编号,且
4
0 1 2 5 1在另外一个公司可能是指一种完全不同的产品。
和通常的想法相反, U P C中没有包含该种产品的价格。产品的价格信息可以从商店中使
用的与该扫描仪相联的计算机中检索互到。
最后的数字(这里是 7)称作模校验字符,这个字符可用来进行另外一种错误检验。为了
解释校验字符是怎样工作的,将前 11个数字(是 0 51000 01251)各用一个字母来代替:
A BCDEF GHIJK
然后,计算下式的值:
3×(A + C + E + G + I + K)+(B + D + F + H + J)
从紧挨它并大于等于它的一个1 0的整倍数中减去它,其结果称为模校验字符。在上例中,有:
3×(0 + 1 + 0 + 0 + 2 + 1)+(5 + 0 + 0 + 1 + 5)= 3×4 + 11 = 2 3
紧挨2 3并大于等于 2 3的一个1 0的整倍数是 3 0 ,故:
3 0-2 3 = 7
这就是印在外包装上并以 U P C形式编码的模校验字符,这是一种冗余措施。如果扫描仪
计算出来的模校验结果和 U P C中编码中的校验字不一致,计算机就不能将这个 U P C作为一个
有效值接收。
正常情况下,表示从 0~9的十进制数字只需 4个比特就足够了。在 U P C中,每个数字用了
7个比特,这样总共有 9 5个比特来表示 11个有用的十进制数字。事实上, U P C中还包括空白位
置(相当于 9个0比特),位于左、右护线的两侧。因而,总共有 11 3个比特用来编码 11个十进
制数,平均每个十进制数所用超过了 1 0个比特位!
正像我们所知道的那样,有部分冗余对于检错来讲是必要的。这种商品编码如果能够很
容易地被顾客用粗头笔修改的话,这种代码措施也就难以发挥其作用了。
U P C编码可以从两个方向读,这一点是非常有益的。如果扫描仪解码的第一个数字是偶
校验(即:每 7位编码中共有偶数个 1),扫描仪就知道它正在从右向左进行解码。计算机系统
用下表对右边的数字解码:
逆向时右边数字的代码
0 1 0 0 111 = 0 0111001 = 5
0 11 0 0 11 = 1 0000101 = 6
0 0 11 0 11 = 2 0010001 = 7
0100001 = 3 0001001 = 8
0 0 11101 = 4 0010111 = 9第9章 二 进 制 数
下载
59
下面是对左边数字的解码表:
逆向时左边数字的代码
1 0 11000 = 0 1000110 = 5
1 0 0 1100 = 1 1111010 = 6
1100100 = 2 11 0 1110 = 7
1 0 11110 = 3 111 0 110 = 8
1100010 = 4 1101000 = 9
这些 7位编码与扫描仪由左向右扫描时所读到的编码完全不同,但不会有模棱两可的现
象。
让我们再看看本书中提到的由点、划组成其间用空格分开的摩尔斯电码。摩尔斯电码看
上去不像是由0和1组成的,但它确实是。
下面回忆一下摩尔斯电码的编码规则:划的长度等于点长度的三倍;单个的点或划之间
用长度与点的长度相等的空格分开;单词内的各个字母之间用长度等于划的长度的空格分
隔;各单词之间由长度等于两倍的划长度的空格分开。
为使分析更加简单,我们假设划的长度是点长度的两倍而不是 3倍。也就是说,一个点是
一个值为1的比特位,一个划是两个值为 1的比特位,空格是值为 0的比特位。
下面是第2章的摩尔斯电码的基本表:
下面是将它转化为比特形式的结果:60
编码的奥秘
下载
注意,所有的编码都以 1开头,以两个 0结束。结尾处的两个零代表单词中各个字母之间
的空格,单词之间的空格用另外的一对 0来表示。因而,“H i , t h e r e”的摩尔斯电码通常是这样
的:
但是,采用比特形式的摩尔斯电码看起来像 U P C编码的横切面:
用比特的形式表示布莱叶盲文比表示摩尔斯电码容易得多。布莱叶编码是 6比特代码。布
莱叶盲文中的每一个字母都是由 6个点组成的,点可能是凸起的,或没有凸起 (平滑)的。如在
第3章中讲的那样,这些点通常用数字 1~6编号:
例如,单词“c o d e”可以用布莱叶盲文这样表示:
如果突起的点是 1,平坦的点是 0,则布莱叶盲文中的每一个符号都可以用 6个比特的二进
制代码表示。单词“ c o d e”中的四个布莱叶字母符号就可以简单地写成:
100100 101010 100110 100010
最左边的一位对应编号为 1的位置,最右边的一位对应编码为 6的位置。
正如前面所讲到的,比特可以代表单词、图片、声音、音乐、电影,也可以代表产品编
码、胶片速度、电影的受欢迎程度、英军的入侵以及某人所挚爱的人的意愿。但是,最基本
的一点是:比特是数字。当用比特表示信息时只要将可能情况的数目数清楚就可以了,这样
就决定了需要多少个比特位,从而使得各种可能的情况都能分配到一个编号。
比特在哲学和数学的奇怪混合物 — 逻辑 — 中发挥作用。逻辑最基本的目标是证明某个
语句是否正确,正确与否也可以用 1和0来表示。下载
第10章 逻辑与开关
真理是什么呢?亚里士多德认为逻辑与它有关。他的讲义合集《工具论》(O rg a n o n,可
追溯到公元前 4世纪)是最早的关于逻辑的详细著作。对于古希腊人而言,逻辑是追寻真理的
过程中用于分析语言的一种手段,因此它被认为是一种哲学。亚里士多德的逻辑学的基础是
三段论。最有名的三段论(它并非是在亚里士多德的著作中发现的)是:
(所有的人都是要死的 ;
苏格拉底是人;
所以,苏格拉底是要死的。 )
在三段论中,两个前提被假设是正确的,并由此推出结论。
苏格拉底之死这个例子看上去似乎太直白了,但还有许多其他不同的三段论。例如,考
虑下面两个由1 9世纪数学家 Charles Dodgson(也就是Lewis Carroll)提出的前提:
(所有的哲学家都是有逻辑头脑的 ;
一个没有逻辑头脑的人总是顽固的。 )
它所能推出的结论一点儿也不明显。(事实上,结论是“一些顽固的人不是哲学家 ( S o m e
dostinate persons are not philosophers)”)请注意结论中一个出乎意料且令人迷惑的词 “一些
( s o m e )”。
两千多年来,数学家们对亚里士多德的逻辑理论苦苦思索,试图用数学符号和操作符来
表现它。 1 9世纪以前,唯一能接近这个目标的人是莱布尼兹( 1 6 4 8—1 7 1 6),他早年涉足逻辑
学领域,后来转向其他学科(比如说,他几乎和牛顿同时独立地发明了微积分 )。
接下来有所突破的是乔治・布尔。
乔治・布尔 1 8 1 5年生于英格兰,他周围的环境对他的
成长很不利。他父亲是鞋匠,而母亲曾是女仆,英国森严
的等级制度使布尔学不到什么有别于父辈的东西。但是,
靠着他自身强烈的好奇心及父亲的帮助(其父对科学研究、
数学和文学有浓厚的兴趣),年轻的乔治自学了上层阶级
男孩才能学到的课程,包括拉丁文、希腊语及数学。由于
他早年在数学方面发表的论文, 1 8 4 9年,布尔被任命为爱
尔兰C o r k市的皇后大学数学系的首席教授。
1 9世纪中期的几位数学家在逻辑理论的数学定义上做
了一些工作(最著名的是迪摩根),但只有布尔有真正概62
编码的奥秘
下载
念上的突破。他最早的贡献是发表的一本很简短的书《 The Mathematical Analysis of Logic,
Being an Essay Towards a Calculus of Deductive Reasoning》( 1 8 4 7 ),接着又发表了一篇很长且
充满抱负的文章:《An Investigation of the Laws of Thought on Which Are Founded the
Mathematical Theories of Logic and Probabilities》( 1 8 5 4 ),简称为《 The Laws of Thought》。
1 8 6 4年的一天,布尔在雨中赶去上课时不幸感染上了肺炎,不治身亡,享年 4 9岁。
我们可以从布尔在 1 8 5 4年所著书的题目中看出他富于野心的想法:由于充满理性的人脑
用逻辑去思考,那么,如果能用数学来表征逻辑,我们也就可以用数学来描述大脑是如何工
作的。当然,现在看来这种想法似乎十分幼稚。(但却超越了他所在的年代。)
布尔发明了一种和传统代数看起来、用起来都十分相似的代数。在传统代数中,操作数
(通常是字母)代表数字,而操作符(多是“ +”或“×”)指明这些操作数如何结合到一起。
一般我们可用传统代数解决类似下面的问题:如果安娜有 3磅豆腐,贝蒂的豆腐是安娜的 2
倍,卡门的豆腐比贝蒂多 5磅,迪尔德丽的豆腐是卡门的 3倍。那么,迪尔德丽有多少豆腐
呢?
为了计算这个问题,我们首先把语句转化为算术式子,用四个字母代表每个人拥有豆腐
的数量,即:
A = 3
B = 2 ×A
C = B+5
D = 3×C
可以通过代入把上述四个表达式合为一个式子,最后执行加法和乘法,即:
D = 3 ×C
D = 3 ×(B + 5)
D = 3 ×((2×A)+ 5)
D = 3 ×((2×3)+ 5)
D = 33
当做传统代数题时,要遵循一定的规则。这些规则可能已经和实践融为一体,以至于我
们不再认为它们是规则,甚至忘记了它们的名字。但规则确实是任何形式的数学的基础。
第一个规则是加法与乘法的交换律,即我们可以在操作符两边交换操作数的位置:
A+B = B+A
A×B = B ×A
相反,减法和除法是不满足交换律的。
加法和乘法也满足结合律,即:
A +(B + C)=(A + B)+ C
A×(B×C)=(A×B)×C
最后,乘法对加法可以进行分配:
A×(B + C)=(A×B)+(A×C)第10章 逻辑与开关
下载
63
传统代数的另外一个特点是它总是处理数字,如豆腐的重量或鸭子的数量,火车行驶的
距离或家庭成员的年龄。是布尔超凡的智慧使代数脱离了数字的概念而变得更加抽象。在布
尔代数中(布尔的代数最终被这样命名)操作数不是指数字,而是指集(类)。一个类仅仅表
示一组事物,也就是后来熟知的集合。
让我们来讨论一下猫。猫或公或母,为方便起见,我们用字母 M指代公猫的集合,用 F指
代母猫的集合。记住,这两个符号并不代表猫的数量,公猫或母猫的数量随着小猫仔的出生
和老猫的不幸离去而变化,这两个字母代表的是猫的种类 — 具有某种特点的猫。因而我们
不说公猫,而是用 M来代表它们。
我们也可以用其他字母代表猫的颜色。例如,用 T代表黄褐色的猫,用 B代表黑猫,用 W
代表白猫,而用 O代表所有其他颜色的猫。
最后(至少就这个例子而言),猫要么是阉过的要么是有生育能力的。我们用字母 N代表
阉过的猫,而用 U代表有生育能力的猫。
在传统代数中,操作符 +和×被用于表示加法和乘法。在布尔代数中,同样用到了 +和×。
这似乎会引起混淆。人人都知道在传统代数中如何对数字进行加和乘,但是我们如何对“类”
进行加和乘呢?
事实上,在布尔代数中我们并不真正地做加或乘,相反,这两个符号有着完全不同的意
思。
在布尔代数中,符号 +意味着两个集合合并,两个集合的合并就是包含第一个集合的所有
成员及第二个集合的所有成员。例如, B + W表示黑猫和白猫的集合。
布尔代数中的符号×意味着取两个集合的交集,两个集合的交集包含的元素既在第一个
集合中,也在第二个集合中。例如, F×T代表了一种猫的集合,这个集合中的猫既是母猫又
是黄褐色的。与传统代数一样,我们可以把 F×T写成F・T或简写为 F T(这正是布尔代数所期
望的)。你可以把这两个字母看成是连在一起的两个形容词:黄褐色的母猫。
为避免传统代数和布尔代数之间的混淆,有时候用符号∪和∩而不用 +和×来表示并运算
和交运算。但布尔对数学的解放性的部分影响是使熟悉的操作符更加抽象,所以,我们决定
坚持他的决定,而不为他的代数引入新的符号。
交换律、结合律和分配律在布尔代数中均适用。而且,在布尔代数中,操作符 +可以对×
进行分配,这在传统代数中是不成立的,即:
W +(B×F)=(W + B)×(W + F)
这个式子表示白猫( W)和黑色母猫( B×F)的并集和等式右边两个集合的交集是一样
的,这两个集合是白猫和黑猫的并集( W + B)及白猫和母猫的并集( W + F)。要掌握这个规
则有些困难,但它的确有用。
为了使布尔代数更加完整,我们还需要两个符号。这两个符号看上去像数字,但它们并
不真的是数字,因为有时候它们和数字有些不同。符号“ 1”在布尔代数中表示“整个宇宙
(全集)”,也就是我们所谈论的每件事物。本例中,符号“ 1”表示“所有的猫”。这样:
M + F = 1
即母猫和公猫的并集是所有的猫。同样,黄褐色猫、黑猫、白猫及其他颜色的猫的并集
也是所有的猫,即:64
编码的奥秘
下载
T + B + W + O = 1
你也可以这样表示所有的猫:
N + U = 1
符号1可以用一个减号-来排除一些事物。例如:
1-M
表示除了公猫以外的所有猫。排除公猫以后的全集就是母猫的集合:
1-M = F
我们所需要的另外一个符号是“ 0”。在布尔代数中,“0”表示空集,即不含任何事物的
集合。当求取两个完全相互排斥的集合的交集时,空集就产生了。例如,既是母的又是公的
猫的集合可以表示为:
F×M = 0
注意,符号 1和0有时的用法与传统代数相同。例如,所有的猫和母猫求交集即是母猫这
个集合:
1×F = F
空集和母猫求交集还是空集:
0×F = 0
空集和母猫的并是母猫这个集合:
0+F = F
但有时与传统代数中得到的结果就不太一样了。例如,所有的猫和母猫的并集是所有的
猫:
1+F = 1
这个表达式在传统代数中是没有意义的。
由于F代表母猫的集合, 1-F代表所有其他猫的集合,则这两个集合的并集是 1:
F +(1-F)= 1
并且它们的交集是 0:
F×(1-F)= 0
历史上,这个公式代表了逻辑中一个十分重要的概念,即矛盾律。它表明一个事物不能
同时是它自己和它自己的反面。
使布尔代数和传统代数看起来完全不同的是下面这个表达式:
F×F = F
这个式子在布尔代数中有着完美的意义:母猫的集合和母猫的集合的交集仍旧是母猫的
集合。但若 F代表一个数字的话,这个公式显然就不对了。布尔认为:
X 2 = X
是使他的代数与传统代数区分开来的唯一表达式。另一个按照传统代数看起来很有趣的
布尔表达式是:第10章 逻辑与开关
下载
65
F + F = F
母猫和母猫的并集仍是母猫这个集合。



1<词>,2[句],3/段\,4{节},5(章)。
2016-2-9 07:39
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zzz19760225
超级版主




积分 3673
发帖 2020
注册 2016-2-1
状态 离线
『第 27 楼』:  

布尔代数为解决亚里士多德的三段论提供了一个数学方法。再看看这个著名三段论的两
个前提:
所有的人都是要死的;
苏格拉底是人。
我们用字母 P代表所有人的集合, M代表要死的东西的集合, S代表苏格拉底。那么,所
谓“所有的人都是要死的”意味着什么呢?它其实表示了所有人的集合和所有要死的东西的
集合的交集是所有的人这个集合,即:
P×M = P
而 P×M = M 这个式子是错误的,因为要死的东西还包括猫、狗、榆树等等。
而“苏格拉底是人”意味着苏格拉底这个集合(非常小)和所有人的集合(很大)的交
集是苏格拉底这个集合:
S×P = S
由于从第一个式子中知道 P = P×M,所以可以把它代入第二个式子,即:
S×(P×M) = S
根据结合律,上式等同于:
(S×P)×M = S
但我们已经知道 S×P等于S,所以上式可简化为:
S×M = S
现在计算完毕。这个表达式告诉我们,苏格拉底和所有要死东西的集合的交集是苏格拉
底,也就是说苏格拉底是要死的。相反,如果认为 S×M等于0,那么结论就是苏格拉底不会
死。再如果,若 S×M等于M,则能推出的结论就是苏格拉底是唯一会死去的东西,而其他任
何东西都是不朽的!
用布尔代数来证明显而易见的事实似乎有些小题大做(尤其当考虑到苏格拉底早已在
2 4 0 0年以前就去世了时),不过,布尔代数还可以用来判断一些事物是否满足一定的标准。也
许有一天,你走进宠物店对店员说:“我想要一只阄过的公猫,白的或黄褐色的均可;或者要
一只没有生殖能力的母猫,除了白色,其他任何颜色均可;或者只要是只黑猫,我也要。”店
员对你说:“看来您想要的猫是下面的式子表示的集合中的一只:
(M×N×(W + T))+(F×N×(1 - W))+ B
对吗?”你回答道:“是的,完全正确!”
为了证明店员是正确的,你可能想放弃并和交的概念而转向“ O R(或者/或)”和“A N D
(并且 /与)”。大写这两个词是因为虽然在通常情况下它们代表语言中的概念,但它们也代表
了布尔代数中的操作。当求两个集合的并集时,你实际上是从第一个集合“或”从第二个集
合中取得事物放入结果集合里。当求两个集合的交集时,满足条件的事物必定在第一个集合
中“并且”也在第二个集合中。此外,每当你看见后跟减号的 1,你可以使用单词“N O T(非)”66
编码的奥秘
下载
来表示。小结如下:
• +(以前表示求并集)现在表示 O R。
• ×(以前表示求交集)现在表示 A N D。
• 1 -(以前表示从全集中排除一些事物)现在表示 N O T。
这样,刚才的表达式可以写成下面的形式:
(M AND N AND (W OR T))O R(F AND N AND (NOT W ))OR B
这与你的口头描述已经十分接近了。注意圆括号是如何清楚地表达出你的意图的。你想
要的猫来自下面三个集合之一:
(M AND N AND(W OR T ))

(F AND N AND (NOT W ))

B
写下这个公式后,店员就可以进行布尔测试的工作了。别这么大惊小怪的,这里已经悄
悄转移到另一种不同形式的布尔代数中去了。在这种形式的布尔代数中,字母不再只表示集
合,字母还可以被赋予数字,但需要注意的是它们只能被赋予 0或者1。数字 1表示“是的”、
“正确”,本例中的意思是“这只猫符合我的要求”;数字 0表示“否定”、“错误”、本例中即
“这只猫不符合我的要求”。
首先,店员拿出一只未阄过的黄褐色的公猫。下面是满足条件的猫的集合:
(M×N×(W + T))+(F×N×(1-W))+ B
当用0和1代替字母后就变成了下面的样子:
(1×0×(0 + 1))+(0×0×(1 - 0))+ 0
注意被赋予了1的字母只有 M和T,因为拿来的这只猫是公的,黄褐色的。
现在必须要做的是简化这个表达式。如果简化后表达式的结果是 1,这只猫就满足了你的
要求,否则就不是你想要的猫。当简化表达式时,千万记住我们并不是在真正地做加法和乘
法。当+表示O R,×表示A N D时,大部分规则是相同的。(现代课本中有时用∧和∨分别表示
A N D和O R,而不用×和+;但这里用 +和×这两个符号却是恰到好处的。)
当用×表示 A N D时,可能的结果是:
0×0 = 0
0×1 = 0
1×0 = 0
1×1 = 1
换句话说,只有当×的左、右两个操作数均为 1时,结果才为 1。这个过程和普通乘法一
模一样。若用一张小表总结一下,你会发现它们和第 8章的加法表和乘法表的形式相似:
A N D 0 1
0 0 0
1 0 1
当用+表示O R时,可能的结果是:第10章 逻辑与开关
下载
67
0+0 = 0
0+1 = 1
1+0 = 1
1+1 = 1
当+的左、右操作数中有一个为 1时,结果就是 1。除了 1 + 1 = 1这种情况,这种计算和普通
加法产生的结果是一致的。可用另一张小表来总结:
O R 0 1
0
1 0
1 1
1
现在可以用这些表来计算前面那个表达式的结果了:
(1×0×1)+(0×0×1)+0 = 0 + 0 + 0 = 0
结果是0,表示“否定”、“错误”,即这只小猫不满足客户需求。
接下来,店员拿来一只无生育能力的白色的小母猫。原始表达式是:
(M×N×(W + T))+(F×N×(1-W))+ B
把0和1代入上式:
(0×1×(1 + 0))+(1×1×(1 - 1))+ 0
并且把它简化一下:
(0×1×1)+(1×1×0)+ 0 = 0 + 0 + 0 = 0
看来,这只可怜的小猫还是不符合要求。
然后,店员又拿来一只无生育能力的灰色的小母猫。(灰色是非白色、黑色或黄褐色的一
种其他颜色。)下面是表达式:
(0×1×(0 + 0))+(1×1×(1 - 0))+ 0
现在把它简化为:
(0×1×0)+(1×1×1)+ 0 = 0 + 1 + 0 = 1
最后的结果 1表示“是的”、“正确”, 这只小猫总算找到新家了!
在你买到小猫的那天晚上,当小猫蜷身睡在你的腿上时,你开始考虑是否能够通过电线
连接一些开关和灯泡来决定哪些小猫满足你的要求。(你真是一个奇怪的家伙。)你丝毫没有
意识到你将要实现一个关键概念上的突破。你要做的是一些试验,这些试验把布尔代数和电
路结合在一起,从而使使用二进制数字工作的计算机的设计和制造成为可能。 (可别让这些话
吓着你。)
下面就开始了。你像往常一样把灯泡和电池连接在一起,这一回你用了两个开关:68
编码的奥秘
下载
开关这种方式的连接 — 一个在另一个的右边 — 称为串联的。如果你闭合了左边的开关,
什么也不会发生:
同样,如果你让左边的开关断开而闭合右边的开关,结果还是一样。只有当左右两个开
关都闭合时,灯泡才会发光,如下所示:
这里的关键是“都”。只有左边和右边的开关都闭合时,电流才能流过回路。
这个电路执行了一个逻辑运算。事实上,灯泡回答了这个问题:“两个开关都处于闭合状
态吗?”可以把电路的工作总结为下面这张表:
左开关状态
断开
断开
闭合
闭合
右开关状态
灯泡状态
断开
闭合
断开
闭合
不亮
不亮
不亮

在前一章中,我们已知道二进制数字(或“位”)是如何表示信息的:它可以表示从最普通
的数字到Roger Ebert的拇指方向等的一切事情。可以说“ 0”代表“E b e r t拇指向下的方向”,而
“1”表示“E b e r t拇指向上的方向”。一个开关有两个位置,所以它可以代表一个位。“0”表示
“开关是断开的”,而“1”表示“开关是闭合的”。一个灯泡有两种状态,所以它也可以表示一
个二进制位。“0”表示“灯泡不亮”而“1”表示“灯泡亮”。现在可以把上面的表简化一下:
左开关状态 右开关状态 灯泡状态
0
0
1 0
1
0 0
0
0
1 1 1
注意,如果交换左、右开关,结果是一样的,所以没必要指明哪个开关是左开关或右开
关。因此这张表可以重画成类似于前面“ A N D”表和“O R”表的样子:第10章 逻辑与开关
下载
开关串联 0 1
0
1 0
0 0
1
69
事实上,这和“ A N D”表是一样的。让我们检查一下:
A N D 0 1
0
1 0
0 0
1
这个简单的电路实际上执行了布尔代数的“ A N D”操作。
现在试着用另一种方式连接电路:
这些开关称为并行连接。它和前一种连接方式的区别是,如果闭合了上面的开关,灯泡
会亮:
如果闭合了下面的开关,灯泡会亮:70
编码的奥秘
下载
如果同时闭合上、下两个开关,灯泡还是会亮:
可见,当上面或下面的开关有一个闭合时,灯泡就会亮。这里的关键字是“或”。
这个电路也执行了一个逻辑运算,灯泡回答了这样一个问题:“是否有开关闭合?”下面
的表总结了这个电路是如何工作的:
上开关状态
下开关状态
灯泡状态
打开 打开 不亮
打开 闭合 亮
闭合 打开 亮
闭合 闭合 亮
仍然用“ 0”表示开关断开或灯泡不亮,用“ 1”表示开关闭合或灯泡亮。这张表可以这
样:
上开关状态 下开关状态 灯泡状态
0 0 0
0
1 1
0 1
1
1 1 1
同样,这两个开关交换位置也没关系,所以这张表可以重写成如下的样子:
开关并联 0 1
0 0 1
1 1 1
你可能已经猜到了这和布尔代数中的“ O R”表是一样的:
O R 0 1
0
1 0
1 1
1
这意味着两个并联的开关执行的是和布尔一样的操作。
当你再进入宠物店时,你告诉店员:“我想要一只阄过的公猫,白的或黄褐色的均可;或
者要一只没生育能力的母猫,除了白色,其他任何颜色均可;或者只要是只黑猫,我也要。”
店员便得到了如下的表达式:第10章 逻辑与开关
下载
71
(M×N×(W + T))+(F×N×(1-W))+ B
现在你知道两个串联开关执行的是逻辑与( A N D,由符号×来表示),两个并联开关执行
的是逻辑或(O R,由符号+来表示),你可以按如下方法连接 8个开关:
这个电路中的每一个开关都被标上了一个字母 (与布尔表达式中所用字母相同 )。 W 表示
非W,是1-W的另一种写法。事实上,如果按从左至右,从上至下的顺序来阅读这个电路图,
你遇到的字母的顺序和它们在布尔表达式中出现的次序是一样的。表达式中的乘号(×)都对应
角是电路图中串联的两个或两组开关的位置;表达式中的加号 (+)号对应的是电路图中并联的
两个或两组开关的位置。
你应该记得,店员最先挑出的是只未阄过的褐色的公猫。闭合相应的开关:
尽管M、T和非W这三个开关都闭合了,但没有构造出一个完整的电路来点亮灯泡。接着,
店员拿出一只无生育能力的白色的母猫:
这次,由于右边开关未闭合也无法构成一个完整的电路。但最后,店员拿出一只无生育72
编码的奥秘
下载
能力的灰色的母猫:
这样就可以构出一个完整的电路,灯泡被点亮并表示小猫符合你的要求。
乔治・布尔从来没有连接过这样一个电路,他也没能看到用开关、电线和灯泡来实现一
个布尔表达式。当然,其中的一个原因是直到布尔死后 1 5年,白炽灯泡才被发明。但摩尔斯
在1 8 4 4年展示了他的电报机,比布尔的《 The Laws of Thought》的发表早 1 0年,而用一个电
报发声器来代替所示电路中的灯泡是十分简单的。
可惜1 9世纪没有人把布尔代数中的与、或和串联、并联一些简单的开关联系起来。数学
家没有、电工没有、电报操作员也没有,没有人想到过这种联系,甚至连计算机革命的创始
人查尔斯・巴贝芝( 1 7 9 2—1 8 7 1)也没有。他曾和布尔联系过,并了解过他的工作,他一生
中大部分时间致力于设计第一台差分机及接下来的解析机。一个世纪之后,这些机器被认为
是现代计算机的雏型。我们现在知道,帮助巴贝芝的是他认识到计算机应产生于电报继电器
中,而非那些齿轮和控制杆。
是的,问题的答案正是电报继电器。下载
第11章 逻辑门电路
在遥远的将来,当人们回顾2 0世纪的计算机发展史时,有人可能会以为一种称为“logic gates
(逻辑门)”的设备是以著名的微软公司创始人的名字命名的( Bill Gates中的G a t e s在英语中有
“门”的意思),其实并非如此。我们很快就会明白,逻辑门和通常让水和人通过的门十分相
似。逻辑门通过阻挡或允许电流通过在逻辑中执行简单的任务。
回忆一下在上一章中你走进一个宠物店所要的那只猫,这可以由下面的布尔表达式说明:
(M×N×(W + T))+(F×N×(1-W))+ B
同时,也可以用下面的电路来选择符合条件的小猫:
这样一个电路有时被称为网络。但在今天,网络这个词更多地被用来指连接起来的计算
机,而不仅仅只是开关的集合。
尽管这个电路包含的全是 1 9世纪发明的东西,但那时却没有人意识到布尔代数可以直接
由电路实现。这种等同性直到 2 0世纪3 0年代才被发现,主要贡献人是克劳德・香农 (生于1 9 1 6
年)。香农在他著名的、于 1 9 3 8年在麻省理工学院所写的硕士论文《 A Symbolic Analysis of
Relay and Switching Circuits》中阐述了这个问题。(1 0年之后,香农的文章 The Mathematical
Theory of Communication》是使用“位( b i t )”这个字来表示二进制数字的第 1篇出版物。)
1 9 3 8年以前,人们已经知道当把两个开关串联起来时,只有两个开关都闭合电流才能流
通;而当把两个开关并联起来时,只需闭合其中的一个即可构成回路。但没有人能像香农那
样清晰地阐述电子工程师可以使用布尔代数的所有工具来设计带开关的电路。此外,如果你
简化了描述网络的布尔表达式,你也可以相应地简化网络。
例如,描述你想要的小猫的表达式是:
(M×N×(W + T))+(F×N×(1-W))+ B
用结合律把用×结合的变量重新排序并按下面的方式重写表达式:
(N×M×(W + T))+(N×F×(1-W))+ B
为更清楚地表达意图,可以定义名为 X和Y的两个新变量:
X = M ×(W + T)74
编码的奥秘
下载
Y = F ×(1-W)
现在,描述你想要的小猫的表达式可以写成下面的样子:
(N×X)+(N×Y)+ B
完成简化后,我们再把 X、Y代回原来的式子。
注意,变量 N在表达式中出现了两次。使用分配律,表达式可以按如下方式重写,并只使
用一个N:
(N×(X + Y))+ B
现在把X、Y表达式代入:
(N×((M×(W + T))+(F×(1 - W))))+ B
由于有很多圆括号,该表达式看上去似乎仍很复杂。但表达式中少了一个变量项(减少
了一次×运算),也就意味着网络中少了一个开关。这是修改后的电路图:
确实,证明修改前后的两个电路图功能是一样的比去证明两个表达式功能是相同的要简
单。
可是,网络中仍然多余了三个开关。理论上讲,你只需要四个开关来定义你心目中的猫
咪。为什么是四个呢?因为每个开关都是一个“位”。你需要一个开关来定义性别(断开表示
公的,而闭合表示母的);一个开关来定义是否有生育能力 (闭合表示阄过的,断开表示未阄
过的 )还需要两个开关表示颜色。因为只有四种可能的颜色(白、黑、褐和其他所有颜色),
而我们知道四种选择可以用两个二进制位来定义,所以只需要两个开关来表示颜色。例如,
两个开关都断开表示白色,一个闭合表示黑色,另一个闭合表示褐色,两个开关都闭合就表
示其他所有颜色。
现在,让我们做一个控制面板来选择一只猫。控制面板上有四个开关(正如你家里的电
灯开关)和一个灯泡:
控制面板下载
第11章 逻辑门电路
75
开关打到上面是指开关闭合,反之是指开关断开。也许表示猫的颜色的两个开关标识得不是
很清楚,这是为了把控制面板做得更简练不得已而造成的。在表示颜色的一对开关中,左边的开
关标着B,如果只有它往上就表示黑色;右边的开关标着T,如果只有它往上就表示黄褐色;B、
T两个开关均往上则表示其他颜色,由O标识;B、T两个开关均往下则表示白色,由W标识。
在计算机专业术语中,开关是一种输入设备,输入是控制电路如何工作的信息。本例中
输入开关对应于描述一只猫咪的 4位信息,输出设备是灯泡。如果开关描述了一只符合条件的
猫,灯泡就会亮。上面介绍的控制面板上的开关被设置成表示一只无生育能力的黑母猫,这
是符合你的要求的,所以灯泡亮了。
现在所要做的是设计一个使控制面板工作的电路。
前面提到过香农的论文题目是《 A Symbolic Analysis of Relay and Switching Circuits》,
他所指的 r e l a y和第6章中所讲的电报系统的继电器很类似。在香农的论文发表时,继电器已被
用作其他目的,尤其是用于电话系统的大型网络。
像开关一样,继电器也可以串联或并联以执行逻辑中的简单任务。继电器的组合称为逻
辑门。这里所说的“逻辑门执行简单逻辑任务”是指逻辑门只完成最基本的功能。继电器比
开关好是因为继电器可以被其他继电器控制而不必用手指控制,这意味着逻辑门可以被组合
起来以执行更复杂的任务,比如一些简单的算术操作。事实上,下一章就要展示如何用电线
连接开关、灯泡、电池和继电器来构造一个加法机(尽管它只能工作于二进制数字状态)。
继电器对电报系统的工作十分重要。连接电报站的电线长距离时电阻很大,需要一种方
法来接收微弱的信号并把它增强后发送出去。继电器通过使用电磁铁控制开关可做到这一点。
事实上,继电器放大了一个很弱的信号使其成为一个强信号。
就我们的目的而言,我们并不对它的信号放大能力感兴趣,真正使我们着迷的是继电器作
为开关可用电来控制而不用手指。可以用电线把继电器、开关、灯泡和一对电池做如下连接:
注意左边的开关是断开的,灯泡不亮。当闭合开关时,电流流过围绕在铁棒上的线圈,
于是铁棒具有了磁性,并把上面有弹性的金属簧片拉下来,从而连通了电路,使灯泡发光:76
编码的奥秘
下载
当电磁铁把上面的金属簧片拉下来时,这个继电器被称为“触发了”。当左边的开关断开
时,铁棒不再有磁性,继电器中的金属簧片则弹回到原来的位置。
这看上去似乎是用一种很不直接的方式点亮灯泡的,但实际上这种方式是很直接的。如
果我们只对点亮灯泡感兴趣,我们完全可以舍弃继电器。但我们的兴趣并非只是点亮灯泡这
么简单,我们有更宏伟的目标。
本章要多次用到继电器(当逻辑门建好之后就会很少再用了),所以要把上面那幅图简化
一下。可以通过大地省去一些导线。在这种情况下,大地仅代表了一个公共端,并不是指真
正的物理接地:
这看上去仍然不够简化,但还不至于那样做。注意两个电池的负极均接地,所以当看到
的电池是这样的时:
可用大写字母“ V(它代表电压)”代替上图中的电池 (如在第 5和第6章中所做的 )。现在
继电器看上去如下图所示:
当右边开关闭合时,电流从 V端流出,经过电磁铁芯流到地上。这使得电磁铁把上面有弹
性的金属簧片拉下来,从而连通了接有灯泡的电路,灯泡点亮:第11章 逻辑门电路
下载
77
上面图显示了两个电源和两个接地,但本章的所有图中,电源,即“ V”,可以互连,接
地端也可以互连。本章及下一章的所有继电器和逻辑门的网络只要求有一个电池,但可能是
一个大容量的电池。例如,上一幅图可只用一个电池,如下所示:
但这幅图并不能清楚地表明要用继电器做什么。先不考虑电路而把注意力放到输入和输
出上,就像前面的控制面板一样:
输出
输入
如果电流流经输入(例如,用一个开关把输入连到“ V”端),电磁铁就会被触发,输出
就有了一个电压。
继电器的输入不一定只能是开关,其输出也未必只限于灯泡。一个继电器的输出可以连78
编码的奥秘
下载
到另一个继电器的输入,如下所示:
当闭合开关时,第一个继电器被触发,它为第二个继电器提供了输入电压,于是第二个
继电器也被触发,灯泡被点亮了:
把继电器连接起来是构造逻辑门的关键。
事实上,灯泡可以两种方式连到继电器上。注意,具有弹性的金属簧片是被电磁铁拉下
来的。平时,金属簧片与上端接触,当电磁铁吸引它的时候,它便和下端接触。我们一直把
金属簧片与下端的接触作为继电器的输出,但我们也可以把它与上端的接触作为输出。当使
用这种输出时,结果正好相反,输入开关断开时灯泡是亮的:下载
第11章 逻辑门电路
79
而当输入开关闭合时,灯泡便灭了:
使用这种开关的继电器称为双掷继电器 ,它的两个输出在电性上是相反的 — 当一个有电
压时,另一个则没有。
顺便说一下,如果你不知道现在的继电器是什么样子,你可以很方便地从当地的电器行
的透明小包里看到一些。有些继电器就像 (加入饮料的 ) 方形小冰块一样大小,如元件号为
2 7 5 - 2 0 6和2 7 5 - 2 1 4的继电器就是这种大小的且经久耐用的继电器。它们被封在一个干净的塑
料外壳里,所以你可以看到电磁铁和弹性金属簧片。本章和下一章所描述的电路都使用的是
元件号为2 7 5 - 2 4 0的继电器,它体积小且价格便宜(每个 $ 2.99)。
正如两个开关可被串联一样,两个继电器也可以串联:
上面继电器的输出为下面的继电器提供了输入电压。如上所示,当两个开关均断开时,
灯泡不会发光。试着闭合上面的开关:80
编码的奥秘
下载
由于下面的开关仍旧断开,下面的继电器没有触发,所以灯泡仍然不亮。若断开上面的
开关而闭合下面的开关:
灯泡仍旧不亮。因为上面的继电器未被触发,电流无法流经灯泡。点亮灯泡的唯一方法
是闭合两个开关:第11章 逻辑门电路
下载
81
现在,两个继电器都被触发了,电流可以在电源、灯泡和接地点之间流通。
同串联开关一样,这两个继电器也执行了逻辑操作。只有当两个继电器都被触发时,灯
泡才会点亮。串联的两个继电器就是一个“ AND gate(与门)”。为避免复杂的图示,电气工
程师使用一个特殊的符号表示“与门”,如下图示:
输入
输出
这是四个基本逻辑门中的第一个。与门有两个输入端(在图的左部),一个输出端(在图
的右部)。这样表示的与门通常输入在左部,输出在右部。这是因为人们习惯于从左到右读图。
但是与门同样可以画成输入在上部、右部或底下。
有两个继电器、两个开关和一个灯泡的原始电路图如下所示:
使用“与门”符号,上图可同样表示成:
注意与门不仅代替了串联的两个继电器,同时也隐含了上面的继电器连着电源,且两个
继电器都是接地的。只有当上下两个开关都闭合时,灯泡才会发光,这就是它之所以叫与门
的原因。
与门的输入未必一定要和开关连接,且输出也不一定只能是灯泡。我们真正要处理的是
输入端的电压和输出端的电压。例如,一个与门的输出可以是另一个与门的输入:82
编码的奥秘
下载
只有当三个开关都闭合时,灯泡才会发光。当上面的两个开关闭合时,第一个与门的输
出会触发第二个与门的第一个继电器,而最下面的开关会触发第二个与门的第二个继电器。
如果把不加电压视为 0,加上电压视为 1,则与门的输出按如下方式由输入来决定:
正如两个串联的开关一样,与门的输入输出关系可作如下描述:
A N D 0 1
0
1 0
0 0
1
与门也可以有多于两个的输入端。例如,假设串联了三个继电器:
只有当三个开关同时闭合时,灯泡才会发光。这种配置可用如下符号表示:下载
第11章 逻辑门电路
83
它被称为三输入端与门。
以下逻辑门可用并联的继电器解释:
注意两个继电器的输出是连接在一起的,这个连接在一起的输出为灯泡提供了电源。任
何一个继电器都可以点亮灯泡,例如,如果闭合上面的开关,灯泡会亮。这时,灯泡从左上
角的继电器得到了电力供应。
如果让上面的开关断开而闭合下面的开关,灯泡也会亮:84
编码的奥秘
下载
当两个开关都闭合时,灯泡同样会亮:
可见,当上开关或下开关中的任何一个闭合时,灯泡都会亮。这里的关键是“或”,所以
这样的门叫“OR gate(或门)”。电气工程师使用如下符号表示或门:
输入
输出
它看上去和与门很相似,只是接输入端的一边是弧形的,很像英语“ O R”中的字母“O”。
或门的两个输入中,只要有一个加上电压,输出就是高电位。同样,如果约定不加电压第11章 逻辑门电路
下载
85
是0,而加电压是1,则或门也有四种可能的组合状态:
可以把或门的输入输出关系小结成如下表格:
O R 0 1
0
1 0
1 1
1
或门也可以有两个以上的输入端(当任一输入端为 1时,输出端就为 1;只有所有输入端
均为0时,输出端才为 0)。
前面解释过继电器可称为双掷继电器,因为其输出可以两种不同的方式连接。通常情况
下,当开关断开时,灯泡不亮:
当开关闭合时,灯泡点亮。
也可以用另外一种连接方式,使开关断开时灯泡点亮:86
编码的奥秘
下载
在这种情况下,只有闭合开关时灯泡才熄灭。以这种方式连接的继电器叫作反向器 。反
向器不是逻辑门(逻辑门通常有两个以上的输入),但它十分有用。反向器可以用下面的符号
表示:
输入
输出
它被称为反向器的原因是当输入为 0时输出却为 1,反之亦然:
有了反向器、与门和或门,我们就可以制作控制板来自动选择理想的小猫了。让我们从
开关开始。第一个开关的闭合表示母猫,断开表示公猫。这样,可以产生称为 F和M的两个信
号,如下图所示:
当F是1,M就是0,反之亦然。同样,第二个开关的闭合表示阄过的猫,而断开表示有生
育能力的猫:
接下来的两个开关更复杂一些,不同的组合要代表四种不同的颜色。这里有两个开关,
都与电源相连:
当两个开关都断开时,它们表示白色。我们用两个反向器和一个与门来产生信号 W。如
果选择了一只白猫, W就为1,否则为0:
当开关断开时,两个反向器的输入是 0,这样反向器的输出(也就是与门的输入)为 1,
这也就意味着与门的输出为 1。一旦一个开关闭合,与门输出即为 0。
为表示一只黑猫,闭合第一个开关,这可以用一个反向器和一个与门实现:第11章 逻辑门电路
下载
87
只有当第一个开关闭合而第二个开关断开时,与门的输出才是 1。同样,当第二个开关闭
合而第一个开关断开时,与门的输出也为 1。我们用来表示褐色:
而如果两个开关都闭合时,用如下图示表示其他颜色:
现在把四个小电路集成为一个大电路(通常,黑点表示电线的连接点,没有黑点的交叉
线是不连接的):
这个连接图看起来十分复杂。但如果仔细地沿着线路走,看清楚每个与门的输入而不要
关心这些输入又连到了别的什么地方,你就会明白电路是如何工作的。如果两个开关都断开,
信号W会是1,其余信号都是 0。如果第一个开关闭合,则信号 B会是1,其余信号都是 0。
连接门和反向器时可以遵循一些简单的规则:一个门(或反向器)的输出可以作为其他
门(或反向器)的输入,但是两个以上的门(或反向器)的输出永远不能互连在一起。
由4个与门和 2个反向器组成的电路叫作“ 2 - 4译码器”。输入是两个二进制位的不同组合,
共代表了 4个不同的值。输出是 4个信号,任何时刻只能有一个是 1,至于哪一个是 1取决于两
个输入位。用同样的原理还可以构造“ 3 - 8译码器”或“4 - 1 6译码器”等等。
选择小猫的表达式的简化表示是:
(N×((M×(W + T))+(F×(1 - W))))+ B
对于表达式中的每一个加号 ( + ),必定对应电路中的一个或门。对于每一个乘号 (×),则
对应一个与门:88
编码的奥秘
下载
电路图左边的符号和它们在表达式中出现的顺序是一样的。这些信号来自于和反向器连
接的开关及 2 - 4译码器的输出。注意,图中用了反向器来表示表达式中的( 1-W)。
你可能会说:“这不过是一堆继电器而已。”不错,这正是一堆继电器,每个与门和或门
中都有两个继电器,一个反向器中有一个继电器,因而只能说你必须习惯它。以后的各章会
用更多的继电器。不过,所幸的是你不用真正地去买一堆回家连起来。
本章再看两个逻辑门。这两个门都会用到这样一个继电器,该继电器在不被触发时,其
输出为高电位(这是用在反向器中的输出)。例如,下面配置中,一个继电器的输出为第二个
继电器提供了电源。当两个输入都断开时,灯泡是点亮的:
如果上面的开关闭合了,灯泡就会熄灭:
灯泡的熄灭是因为第二个继电器没有电源供应。同样,若下面的开关闭合灯泡也会熄灭:下载
第11章 逻辑门电路
89
若两个开关都闭合,灯泡还是不亮:
这种行为和或门的行为正好相反,被称为“ NOR gate (或非门)”。下面是或非门的符
号:
它和或门的符号很相像,只是在输出端有一个空心的小圆圈,这个小圆圈表示反向,故90
编码的奥秘
下载
而或非门也可用下面的表示:
或非门的输出如下表所示:
N O R 0 1
0
1 1
0 0
0
这张表显示的结果和或门相反。在或门中,输入端中只要有一个是 1,输出就是 1;只有
输入端均为 0时,输出才为0。
连接两个继电器的另一种方式如下图所示:
在这种情况下,两个输出连在一起。除了连在继电器的另一个触点上之外,这种连接形
式与或门类似。当两个开关都断开时灯泡是亮的。
当只有上面的开关闭合时,灯泡也是亮的:下载
第11章 逻辑门电路
91
当只有下面的开关闭合时,灯泡也是亮的:
只有当两个开关都闭合时,灯泡才会熄灭:
这种行为和与门的行为正好相反,被称为“ NAND gate (与非门)”。与非门的画法和与
门的画法很相像,只是在输出端加了一个小圆圈,表示其最后的输出和与门的输出是相反的:92
编码的奥秘
下载
输出
输入
与非门的输出如下表所示:
N A N D 0 1
0
1 1
1 1
0
注意,与非门的输出与与门恰恰相反。对与门而言,当两个输入都为 1时,输出才为 1;
否则输出就是0。
到此为止,我们已经看到可用四种不同的方式来连接有两个输入、一个输出的继电器,
每一种方式的行为功能都不一样。为避免画继电器,我们把这些连接称为逻辑门并使用电气
工程师们使用的符号来表示它们。特定的逻辑门的输出取决于其输入,总结如下:
A N D 0 1 O R 0 1
0
1 0
0 0
1 0
1 0
1 1
1
N A N D 0 1 N O R 0 1
0
1 1
1 1
0 0
1 1
0 0
0
现在已有了四个逻辑门和一个反向器,完成这些工具的其实就是原始的继电器:
上图称为缓冲器,用符号表示如下:
它和反向器的符号类似,只是没有小圆圈。缓冲器的特点是“什么都不做”,其输出和输
入是相同的:
当输入信号很弱时,可以使用缓冲器,这是因为这也正是多年前继电器被用于电报当中下载
第11章 逻辑门电路
93
的原因。此外,缓冲器也可用于延迟一个信号,这是因为继电器可能要求多一点儿动作时间,
如1秒的几分之一才被触发。
本书从现在开始不再画继电器,取而代之的是电路将由缓冲器、反向器、
4个基本逻辑门及更复
杂的电路(如 2- 4译码器)组成。当然,所有这些部件也是由继电器构成的,但我们用不着看到它了。
前面讲过,可用下面的小电路构造一个 2- 4译码器:
两个输入被反向后成为与门的输入。有时,像这样的配置可以去掉反向器而画成如下的样子:
注意与门输入端的小圆圈,这些小圆圈表示信号在这些点上被反向了, 0会变成1,而1变为0。
具有反向输入端的与门和或非门的行为是一样的:
只有两个输入端都为 0时输出才为 1。
同样,具有反向输入端的或门和与非门的行为是一样的:
只有输入端均为 1时输出才为 0。
这两对等同的电路实际上就是迪摩根定律的内容。迪摩根是维多利亚时代的另一位数学
家,他比布尔年长 9岁。据说,他的书《 Formal logic 》发表于 1 8 4 7年,和布尔的《 T h e
Mathematical Analysis of logic》恰好是同一天。事实上,布尔正是由于受到发生在迪摩根和
另一个英国数学家之间的剽窃事件的触动而研究逻辑的。(迪摩根最后证明是清白的。)很早
以前,迪摩根就意识到了布尔思想的重要性。他无私地鼓励和帮助布尔进行研究,但最终除
了他的这个著名的定律外,他几乎被人们遗忘了。
迪摩根定律可以简单地表示成:
A和B是两个布尔操作数。在第一个表达式中,它们被取反(即反向)后再相与。这和先
把它们相或后再取反(或非门的功能)的结果是一致的。第二个表达式中,两个操作数被取
反后再相或,这和先把它们相与后再取反(与非门的功能)的结果是一样的。
迪摩根定律对于简化布尔表达式,进而简化电路是一个很重要的工具。从历史上讲,这
正是香农的论文对电气工程师的真正含义。但是,专门简化电路并非本书的焦点,更重要的
是让事物工作、起作用。下面我们要运行起来的就是一台简单的加法机。下载
第12章 二进制加法机
加法是最基本的算术运算。所以,如果想要建造一台计算机(这是本书隐含讨论的问题),
必须首先知道如何构造一种机器,它可以把两个数加起来。当你解决了这个问题,你会发现
加法正是计算机唯一所做的事情,因为通过使用用于加法的机器,我们还可以构造用加法来
实现减法、乘法、除法以及计算房产抵押款、引导向火星发射卫星、下棋和电话计费等等功
能的机器。
同现代的计算器和计算机比起来,本章构造的加法机庞大、笨重、速度慢且噪声大。但
有意思的是构成它的部件完全是前几章学过的电子设备,如开关、灯泡、电线、电池以及可
构成几种逻辑门的继电器。这个加法机包含的所有部件都于 1 2 0年以前就已发明,而且,我们
并不用真正地在屋子里建造它,只需在纸上和脑子里构造这台机器就行了。
这个加法机只能工作于二进制数,而且它缺少很多现代计算机(器)的辅助设备。它不
能用键盘来敲入你想加的数,代之的你只能用一系列开关表示待加的数。它也不能用显示器
显示结果,你所看到的只是一排灯泡。
但这台加法机确实实现了两数相加的功能,而且其工作方式和计算机做加法十分相似。
二进制加法与十进制加法很像。当你相加十进制数如 2 4 5和6 7 3时,你把问题分解成简单
的步骤,每一步只对一对十进制数字相加。本例中,第 1步是把5和3加起来。生活中,你若能
记住加法表,问题的解决就快多了。
十进制加法和二进制加法的一大区别是二进制数字的加法表要比十进制数字的加法表简
单得多:
+ 0 1
0 0 1
1 1 1 0
你可能在学校里记过上面这张表,并背诵过如下口诀:
0加0等于0,
0加1等于1,
1加0等于1,
1加1等于0,进1。
把相加结果的数前加上零,可以把加法表改写成如下形式:
+ 0 1
0 0 0 0 1
1 0 1 1 0
这样一来,二进制数字相加的结果是两位数,分别称为“和”和“进位”(比如“ 1加1等
于0,进位是1”)。现在,可以把这张二进制加法表分成两张表,第 1张是表示“和”的表:第12章 二进制加法机
下载
+和 0 1
0
1 0
1 1
0
+进位 0 1
0
1 0
0 0
1
95
第2张是表示“进位”的表:
以这种方式来看待二进制加法就很方便了,因为加法机会分开求和与进位。构造二进制
加法机需要设计一个能执行表中所描述操作的电路。因为电路的所有部件,如开关、灯泡、
电线都是可以表示成二进制数的,因而该电路由于仅工作于二进制数从而大大降低了电路的
复杂性。
与十进制加法一样,二进制加法也从最右边的一列开始,逐列相加两个数:
0 1 1 0 0 1 0 1
+ 1 0 1 1 0 1 1 0
1 0 0 0 1 1 0 1 1
注意,当从右边加到第 3列的时候,产生了一个进位。同样的情况也发生在第 6、7、8列。
我们要加多大的数呢?由于这个加法机只是在脑子里构造,因而可以加很长的数字。为
更合理一些,选择不超过 8位的二进制数。也就是说,操作数的范围是从 0 0 0 0 - 0 0 0 0~1111 -
1111,即十进制的0~2 5 5。两个8位二进制数的和最大可以是 1 - 1111 - 111 0,即5 1 0。
此二进制加法机的控制面板如下图所示:
板上有两行开关,每行 8个。这些开关集是输入设备,我们将用它输入两个 8位数。开关
往下表示 0,往上表示 1,正如家里墙上的开关。输出设备在板的底部,是一行灯泡,共 9个。
这些灯泡用来表示加法的结果,不亮的灯泡表示 0,亮的表示1。我们用了 9个灯泡是因为两个
8位数相加的结果可能是 9位数。
加法机的余下部分包含了以不同方式连接而成的逻辑门。开关触发逻辑门中的继电器,
继电器接着点亮相应的灯泡。例如,如果我们想把 0 11 0 - 0 1 0 1和1 0 11 - 0 11 0加起来(即前例中
显示的两个数字),需把相应的开关设置成下面的样子:96
编码的奥秘
下载
灯泡的亮暗表明答案是 1 - 0 0 0 1 - 1 0 11。(当然,这只是希望的情况。毕竟,我们还没有把这
个加法机构造出来!)
上一章提到过本书将会用到很多继电器,本章中的 8位加法机就至少需要 1 4 4个继电器,
其中每一对数进行加法操作需要 1 8个继电器( 8 × 1 8 = 1 4 4)。如果画出完整的电路图,你一定
会大惊失色,任何人都无法将连成一堆的 1 4 4个继电器看得明明白白,所以我们将用逻辑门分
步解决这个问题。
当你看到下面两个 1位二进制数相加的进位表时,你可能立刻会想到逻辑门和二进制加法
之间有某种联系:
+进位
0
1
0 1
0
0 0
1
你也许已意识到这和上章所述的与门的输出是一样的:
A N D 0 1
0
1 0
0 0
1
所以,与门可以用来计算两个 1位进制数位相加得到的进位。
看来我们已取得一点儿进展了,下一步就要看看有没有继电器能完成下面的工作:
+和 0 1
0
1 0
1 1
0
这是二进制加法运算中的另一半问题,虽说表示和的这一位不如进位那么容易实现,但
我们会有办法。
首先应意识到或门的输出和我们所期望的很近似,只是右下角的结果不同:
O R 0 1
0
1 0
1 1
1
而对于与非门而言,除了左上角的输出不同以外,其他结果也与期望的一样:
N A N D 0 1
0
1 1
1 1
0
所以,使用相同的输入,让我们把与非门和或门连接起来:
A输入
或门输出
B输入
与非门输出
下表总结了或门和与非门的输出,并将其结果和加法机所要求的结果进行比较:第12章 二进制加法机
下载
A \输入
或门输出 与非门输出
B输入
0
0
1
1
0
1
0
1
0
1
1
1
97
需要的结果
1
1
1
0
0
1
1
0
注意,当或门和与非门的输出都为 1时,就可以得到期望的结果 1,这暗示着把两个输出
作为与门的输入:
A输入
B输入
输出
好,这样就能满足要求了。
整个电路仍然只有两个输入,一个输出。两个输入既连到了或门,也连到了与非门。或
门和与非门的输出作为与门的输入,从而得到预期的结果:
A输入
0
0
1
1
B输入 或门输出 与非门输出 与输出
0
1
0
1 0
1
1
1 1
1
1
0 0
1
1
0
这个电路有它自己的名字,称为“异或门( Exclusive OR gate 或 X O R)”。异或门输出为
1时,A输入为1或B输入为1,但不能同时为 1。不用再去画一个或门、一个与非门和一个与门,
可以用电气工程师规定的符号来表示它:
输入
输出
它看上去和或门很像,只是在输入端还有一条曲线。异或门的行为表示如下:
X O R 0 1
0
1 0
1 1
0
异或门是本书需要详细描述的最后一个逻辑门(在电气工程中有时还会遇到第六个门,
称为“同或门”,同或门只有两个输入相等时输出才为 1。同或门描述的输出情况正好和异或
门相反,所以这个门的符号和异或门相同,同时在输出端有一个小圆圈)。
让我们来总结一下。两个二进制数相加产生两个表,一个是表示“和”的表,另一个是
表示“进位”的表:
+和 0 1 +进位 0 1
0
1 0
1 1
0 0
1 0
0 0
198
编码的奥秘
下载
用下面两个逻辑门可以得到同样的结果:
X O R 0 1 A N D 0 1
0
1 0
1 1
0 0
1 0
0 0
1
二进制数的“和”可以由异或门得到,而“进位”可以由与门得到,所以可以把异或门
和与门结合起来来完成两个二进制数 A和B的加法:
A输入
和输出
B输入
进位输出
不用画与门和异或门,可以把上图简单地表示成如下的样子:
A输入
半加器
和输出
进位输出
B输入
其中的方块称为“半加器(Half Adder)”,它可以把两个二进制位 A 和 B相加,从而得到
一个和输出 (简称S) 和一个进位输出 (简称C O )。但大部分二进制数是多于 1位的,半加器不能
够把前一步的进位加到本次运算中。例如做如下加法:
1 1 1 1
+ 1 1 1 1
1 1 1 1 0
只能用半加器来计算最右边一列数:即 1加1等于0,进位为 1。对于右边第 2列数,由于进
位的存在,需要加 3个数。接下来的几列都有这个问题,每一列二进制位的加法都包括了来自
前一列的进位。
要把3个二进制数相加,需要按如下方式把两个半加器和一个或门连接起来:
进位输入
半加器
和输出
A输入
半加器
进位输出
B输入
要理解它的工作原理,先从最左边第一个半加器的 A 输入和 B 输入开始,其输出是一个
和及相应的进位。这个和必须和前一列的进位输入 (简称CI) 加起来,然后把它们输入到第二
个半加器。第二个半加器的和输出是最后的和。两个半加器的进位输出又输入到一个或门,
或门产生了本次加法的进位输出。你可能会想这里还需要一个半加器,这当然是可行的。但第12章 二进制加法机
下载
99
当你把所有的可能情况考虑完,你会发现两个进位不可能同时为 1。当两个输入不能同时为 1
时,或门已足够用于表示两个进位的加法,此时或门和异或门的功能是相同的。
上图可简化表示为下面的方块图,称其为“全加器(Full Adder)”:
进位输入
和输出
全加器
A输入
进位输出
B输入
下面的表是对全加器所有可能的输入及其相应输出的小结:
A输入
0
0
1
1
0
0
1
1
B输入
0
1
0
1
0
1
0
1
进位输入 和输出 进位输出
0
0
0
0
1
1
1
1 0
1
1
0
1
0
0
1 0
0
0
1
0
1
1
1
前面说过加法机需要 1 4 4个继电器,这个数目是如何得到的呢?每个与门、或门、与非门
都需要 2个继电器,所以,一个异或门需 6个继电器。一个半加器由一个异或门和一个与门构
成,所以它要 8个继电器。 1个全加器需要两个半加器和一个或门,所以它要 1 8个继电器。对
于8位二进制加法机而言,共需 8个全加器,因而总共是 1 4 4个继电器。
回想一下本章最开始那个带开关和灯泡的控制面板:
现在可以把这些开关和灯泡连接成全加器了。
首先把最右边的两个开关和一个灯泡连到一个全加器上,如下图所示:
全加器
进位输出100
编码的奥秘
下载
当把两个二进制数相加时,第 1列的处理有所不同。因为接下去的几列可能包括来自前面
加法的进位,而第 1列不会有进位,所以全加器的进位输入端是接地的,这表示输入为“ 0”。
第1列相加后很可能会产生一个进位输出,这个进位输出是下一列加法的输入。
对于接下去的两个二进制位和灯泡,可以按如下办法连接全加器:
进位输入
全加器
进位输出
第一个全加器的进位输出是第二个全加器的进位输入。接下去的每一列数都以这种方式
连接,每一列的进位输出都是下一列的进位输入。
第八个灯泡和最后一对开关连到最后一个全加器上,连接方式如下图所示:
进位输入
全加器
这里最后的进位输出连到第九个灯泡上。
这样,8个全加器就构造成功了。
还可以用另一种方式来看 8个全加器的集成,每个全加器的进位输出都是下一个全加器的
进位输入:
进位输入
进位输出
8位和
下面是一个完整的屏蔽在一个盒子里的 8位加法器。输入是A和B标识为从A 0 ~A 7 及B 0 ~B 7 。第12章 二进制加法机
下载
101
输出为和输出,标识为从 S 0 ~S 7 :
A输入
B输入
进位输入
8位加法器
进位输出
和输出
这是标识多位数字的常用方法。下标为 0的位 A 0 、B 0 和S 0 表示最右边的、最不起眼的位。
而位A 7 、B 7 和S 7 是最左边的、最引人注目的位。例如,下面展示的是这些字母是如何用来表示
二进制数0 11 0 - 1 0 0 1的:
A 7 A 6 A 5 A 4 A 3 A 2 A 1 A 0
0
1
1
0
1
0
0
1
下标始于0,且向高位递增的原因是它们和 2的乘方数(幂)是对应的:
2 7 2 6 2 5 2 4 2 3 2 2 2 1 2 0
0 1
1
0 1
0
0 1
如果把每个二进制位和对应的 2的幂次方相乘再依次相加,你就会得到 0 11 0 - 1 0 0 1的十进
制数表示,即6 4 + 3 2 + 8 + 1=1 0 5。
8位加法器的另一种画法是:
A输入
B输入
进位输入
8位加法器
进位输出
双线箭头包含了8个输入端,代表一组8个分开的信号。它们标识为A 7 ...A 0 、B 7 ...B 0 、S 7 ...S 0
也用来表示一个 8位二进制数。
一旦构造了一个 8位加法器,就可以构造另一个加法器。把它们级联起来可以很容易地构
成1 6位加法器:
A输入 B输入
(高8位) (高8位)
8位加法器
A输入
(低8位)
进位输出
进位输入
进位输出
16位和
B输入
(低8位)
进位输入
8位加法器102
编码的奥秘
下载
右边加法器的进位输出连到左边加法器的进位输入端。左边加法器的输入包含了两个加
数的高8位,同时产生了结果的高 8位。
现在,你可能会问:“计算机真的是以这种方式把数字加起来的吗?”
基本上是这样的,但不完全是。
首先,加法器应该做得更快。如果你明白这个电路是如何工作的,你会看到最低位相加
产生的进位作为下一列数相加的一个输入,而第 3列的加法又等着第 2列加法的进位,依此类
推。加法器总体的速度等于加数的位数乘以单个全加器的速度。这种进位方式称为行波进位。
更快的加法器使用称为先行进位的加法电路,从而加快了加法进程。
第二(但是十分重要),计算机再也不用继电器了!尽管它们曾经用过。建于 2 0世纪3 0年
代初的第一批数字计算机使用继电器,后来又用了真空管。现代计算机用晶体管。当用在计
算机中时,晶体管和继电器的功能差不多,但是晶体管速度更快,体积更小,更安静,更省
电,而且还便宜不少。构造一个 8位加法器仍然需要 1 4 4个晶体管(如果采用先行进位,则需
要更多),但整体电路的体积却小多了。



1<词>,2[句],3/段\,4{节},5(章)。
2016-2-9 07:43
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zzz19760225
超级版主




积分 3673
发帖 2020
注册 2016-2-1
状态 离线
『第 28 楼』:  

第13章 如何实现减法
在你确信继电器可以连接起来以构成二进制加法器后,你可能会问:“减法器如何实现
呢?”本章将会为你解答这个问题,且提出这个问题也表明你有了一定的理解力。减法和加
法在某些方面是互为补充的,但两种计算的机制不同。加法从最右边一列向最左边一列计算,
每一列的进位都加到下一列中去。减法不用进位,相反,要用到借位 — 一种本质上与加法
不同的机制。
例如,让我们看一道典型的不断借位的减法题目:
2 5 3
- 1 7 6
? ? ?
要做这道题,从最右边一列开始。首先, 6比3大,所以需要从 5借1,这样就变成了1 3减6,
结果是7。由于从5借了1,5就变成了4,4比7小,所以继续从 2借1,1 4减7等于7。2被借1后成
为1,1减1为0,所以最后结果是 7 7:
2 5 3
-1 7 6
7 7
如何用逻辑门来实现这看似不合常理的逻辑呢?
我们不会直接用这种方法,代替的是用一个小技巧,使不通过借位来实现减法。这会是
一个使大家都满意的好办法。详细地了解减法的完成是很有用的,因为它和用二进制编码在
计算机中存储负数的机制有很大联系。
为解释这样的工作,需要清楚地指明两个操作数,即减数和被减数。减数从被减数中去
掉后,结果是二者之差:
被减数
-
减数

要想不借位,首先将减数从 9 9 9中减去:
9 9 9
-1 7 6
8 2 3
这里用 9 9 9是因为操作数是 3位,如果是 4位数,就用 9 9 9 9。把一个数从一串 9中减去得到
的结果称为9的补数或补码。1 7 6的9的补数是 8 2 3,反之,8 2 3的9的补数是 1 7 6。这样做的好处
在于,无论减数是什么,计算 9的补数永远不需要借位。
在计算出减数的 9的补数之后,把它加到原来的被减数上:104
编码的奥秘
下载
2 5 3
+ 8 2 3
1 0 7 6
最后,你再加1并且减去 1 0 0 0:
1 0 7 6
+
1
- 1 0 0 0
7 7
这样就得到结果了。答案和以前一样,且你根本不用借位。
这是什么原理呢?原来的减法题目是:
2 5 3-1 7 6
表达式加一个数再减同一个数得到的结果是一样的。所以先加上 1 0 0 0,再减去1 0 0 0:
2 5 3-176 + 1000-1 0 0 0
这个式子等同于下面的式子:
2 5 3-176 + 999 + 1-1 0 0 0
再按如下方式重新组合:
2 5 3 +(9 9 9 - 1 7 6)+ 1-1 0 0 0
这与前面描述过的用 9的补数进行的计算是一致的。虽然用了两个减法和两个加法来代替
一个减法,但是也因此省去了讨厌的借位。
但是,如果减数比被减数大怎么办呢?例如如下计算:
1 7 6
- 2 5 3
? ? ?
通常情况下,你看到这个式子后可能会说:“减数比被减数大只需交换两数位置,再做减
法,然后给结果取个相反数。”于是你在脑子里交换了它们的位置,并求出了答案:
1 7 6
-2 5 3
-7 7
要省去借位来做这道题和前面的例子有所不同。首先你要求出 2 5 3的9的补数,即
9 9 9
-2 5 3
7 4 6
再把该补数和原来的被减数相加:
1 7 6
+ 7 4 6
9 2 2第13章 如何实现减法
下载
105
这时候,按照上一道题的步骤,你应该对其加 1再减去1 0 0 0,但在本题中,这种方法不会
生效。如果你还按这种步骤做,就需要从 9 2 3中减去1 0 0 0,这又导致了借位。
既然实际上前面已经加了 9 9 9,这里再减去9 9 9:
9 2 2
-9 9 9
? ? ?
当做到这一步时,可看出结果是个负数,故需要交换两数位置,不过这样再做减法时已
不需要借位,答案如预期所料:
9 2 2
-9 9 9
- 7 7
同样的方法可用于二进制数减法,而且会比十进制数减法来得简单。让我们看看该如何做。
原来的减法题目是:
2 5 3
-1 7 6
? ? ?
当把这些数转化为二进制数时,问题变成:
11111101
-10110000
????????
步骤1 用11111111减去减数:
1 1 1 1 1 1 0 1
- 1 0 1 1 0 0 0 0
01 0 0 1 1 1 1
当计算十进制数减法时,减数是从一串 9中减去,得到称为 9的补数的结果。对于二进制
数减法,减数从一串1中减去,差称为1的补数。但请注意,求1的补数实际上并不需要做减法,
因为 1的补数中,原来的 0变成1,原来的 1变成 0,所以, 1的补数有时也称为相反数 或反码。
(你是否还记得第 11章中反向器的作用是把 0变成1,把1变成0。)
步骤2 把步骤1中求得的补数和被减数相加:
1 1 1 1 1 1 0 1
+ 0 1 0 0 1 1 1 1
1 0 1 0 0 1 1 0 0
步骤3 对结果加1:
1 0 1 0 0 1 1 0 0
+
1
1 0 1 0 0 1 1 0 1
步骤4 减去1 0 0 0 0 0 0 0 0(2 5 6):106
编码的奥秘
下载
1 0 1 0 0 1 1 0 1
- 1 0 0 0 0 0 0 0 0
1 0 0 1 1 0 1
该结果就是十进制数 7 7。
现在把两数颠倒位置后再做一遍。在十进制中,减法题目对应于:
1 7 6
-2 5 3
? ? ?
而在二进制中,即是:
1 0 1 1 0 0 0 0
- 1 1 1 1 1 1 0 1
? ? ? ? ? ? ? ?
步骤1 从11111111中减去减数。得到补数:
1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 0 1
0 0 0 0 0 0 1 0
步骤2 把步骤1中的补数和被减数相加:
1 0 1 1 0 0 0 0
+ 0 0 0 0 0 0 1 0
1 0 1 1 0 0 1 0
现在, 11111111 必须再从结果中减掉。当减数比被减数小时,可以通过先加
1再减去
1 0 0 0 0 0 0 0 0来达到此目的。但现在这样做却会用到借位。所以,我们先用 11111111减去步骤 2
中的结果:
1 1 1 1 1 1 1 1
-1 0 1 1 0 0 1 0
0 1 0 0 1 1 0 1
这实际上是对步骤 2中得到的结果取反。最后的结果是 7 7,而真正的答案应该是- 7 7。
现在,已经可以改进加法机使它既能执行加法操作亦能执行减法操作。为使简便起见,
这个加/减法机只执行被减数大于减数的减法操作,即差为正数的操作。
该加法机的核心部件是由逻辑门集成的 8位全加器:
B输入
A输入
8位加法器
进位输出
和输出
进位输入第13章 如何实现减法
下载
107
前面讲过输入 A 0 ~A 7 及B 0 ~B 7 连接到开关上,用于表示 8位操作数。进位输入端接地。
S 0 ~S 7 连接 8个灯泡,用于表示加法的和。由于和可能会是 9位数,进位输出端也连了一个
灯泡。
控制面板如下图所示:
上图中,开关被设为 1 8 3 (或 1 0 11 0 111 )和 2 2 (或 0 0 0 1 0 11 0),产生的结果是 2 0 5或
11 0 0 11 0 1 )。用于加 /减法的新的控制面板有一点儿修改,它包含了一个用于选择做加法还是做
减法的额外开关。
减法
加法
上溢
下溢
如图所示,当这个开关向下时表示选择加法运算,反之是选择减法运算。此外,只有最
右边的 8个灯泡用于表示结果,第九个灯泡用来标识上溢 /下溢,它指明了一个不能用 8个灯泡
表示的数。当加法操作得到的和大于 2 5 5(称为上溢)或减法计算中出现一个负数(下溢)时,
这个灯泡就会亮。减数比被减数大时,结果就是一个负数。
这个加法机主要增加了一个求 8位二进制数的补数的电路。由于一个数的补数就是取其每
一位的相反数,所以这个电路看起来很简单,就是 8个反向器而已。
输入
输出
该电路存在一个问题,就是它不分情况地对输入求反。我们需要一台既能做加法又能做
减法的机器,而此电路只有做减法时才取反。对它进行一下改进,如下图所示:108
编码的奥秘
下载
输入
取反
输出
图中标识为“取反”的信号输入到每一个异或门中。回忆一下异或门的功能:
X O R 0 1
0
1 0
1 1
0
如果“取反”信号为 0 ,则异或门的 8 个输出和 8 个输入是相同的。例如,如果输入是
0 11 0 0 0 0 1 , 则输出也是 0 11 0 0 0 0 1 ;若“取反”信号为 1 ,则输出取反。例如,当输入是
0 11 0 0 0 0 1时,输出为 1 0 0 1111 0。让我们把 8个异或门集成到一个盒子里,称为求补器:
输入 7 输入 6 输入 5 输入 4 输入 3 输入 2 输入 1 输入 0
取反
求补器
输出 7 输出 6 输出 5 输出 4 输出 3 输出 输出 1 输出 0
2
求补器、8位加法器及一个异或门可按下图连接:
A输入
B输入
取反
求补器
8位加法器
上溢
下溢
和输出第13章 如何实现减法
下载
109
注意上图中有 3个信号都标识为“ S U B”,这是加 /减法转换开关。当该信号为 0时做加法,
为1时做减法。做减法时, B输入在送入加法器之前先求补。此外,做减法时,通过设置加法
器的进位输入端 ( C I )为1,使由加法器得到的结果加 1。对加法而言,求补电路没有起作用,
C I输入也就是 0。
“S U B”信号及加法器的 C O输出作为异或门的输入来控制表示上溢 /下溢的小灯泡。如果
“S U B”信号为0(表示做加法),则当C O输出为1时灯泡点亮,这表示加法的和大于 2 5 5。
当做减法时,如果被减数大于减数,则加法器的 C O端正常输出 1,这表示在减法的最后
一步中要减去 1 0 0 0 0 0 0 0 0。所以,只有当加法器的 C O输出为 0时,上溢 /下溢灯泡才被点亮。
这时减数大于被减数,差是个负数。上面这个加 /减法器现在还不能表示负数。
你一定兴致勃勃地想知道该如何实现减法了。
本章一直在谈论负数,但没有指出二进制负数的表示方法。你可能会认为它的表示和十
进制负数一样,只需在数的前面加个负号。例如,- 7 7在二进制中写成- 1 0 0 11 0 1。你当然可
以这么表示,但别忘了用二进制数的目的在于只用 0和1表示所有的东西,当然也包括一个小
小的负号了。
你可以用某一位代替负号,当该位为 1时就表示负数,为 0时表示正数,这似乎也是可行
的。但还有一种方法,它不仅能表示负数,而且还很适于把正数和负数相加到一起。这种方
法的不足之处是你必须提前决定数字需要多少位。
通常用来表示正、负数的方法的好处是这种方法能表示所有的正数、负数。我们把 0想象
成向一个方向延伸的无穷的正数流和向另一个方向延伸的无穷的负数流的中点:
... -1 000 000 -999 999... -3 -2 -1 0 1 2 3... 999 999 1 000 000 ...
但是,如果并不需要无限大或无限小的数,而是完全可以确定计算中所遇到的数的范围,情况
便有所不同了。
下面来看看帐户的例子,人们有时可以在帐户上看到负数。假设帐户上从来没有超过
$ 5 0 0的存款,而银行给我们的预支额是 $ 500 ,这就意味着帐户上的数字在 $ 4 9 9~-$ 500 之间。
假设我们不会一次取出 $ 5 0 0,也不会写一张超过 $ 5 0 0的支票,同时我们只处理美元,而不考
虑到更小的货币单位 — 美分。
这些假设表明帐户能处理的数字范围是从- 5 0 0~4 9 9,总共 1 0 0 0个数。这个限制暗示我
们只能用 3位十进制数,且可不用负号来表示这 1 0 0 0个数。其中的关键在于我们不需要 5 0 0~
9 9 9之间的正数,所以它们就可以用来表示负数。下面是其工作原理:
用5 0 0表示 - 5 0 0
用5 0 1表示 - 4 9 9
用5 0 2表示 - 4 9 8
用9 9 8表示 - 2
用9 9 9表示 - 1
用0 0 0表示0
用0 0 1表示1
用0 0 2表示2110
编码的奥秘
下载
用4 9 7表示 4 9 7
用4 9 8表示4 9 8
用4 9 9表示4 9 9
换句话说,以5、6、7、8、9开头的3位数实际上都表示负数。不用如下的表示法:
-500 -499 -498 ... -4 -3 -2 -1 0 1 2 3 4 ... 497 498 499
而用这样的表示法:
500 501 502 ... 996 997 998 999 000 001 002 003 004 ... 497 498 499
注意这样形成了一个环形排序,最小的负数( 5 0 0)看上去是最大的正数( 4 9 9)的延续。
数字9 9 9是比零小的第一个负数。如果给 9 9 9加上1,通常得到 1 0 0 0。但由于只处理 3位数,所
以实际上是 0 0 0。
这种处理称为1 0的补数。要把3位负数转换成 1 0的补数,需从 9 9 9中减去它再加 1。换句话
说,1 0的补数是 9的补数再加 1。例如,要把- 2 5 5写成1 0的补数,应先从 9 9 9中减去 2 5 5得到
7 4 4,再加上1后得到7 4 5。
你可能听说过“减法不过是负数的加法”,你也可能回答过“其实还是不得不做减法”。
然而,通过使用 1 0的补数,就不用去做减法了,全部都可以用加法来计算。
假设你有余额为 $ 1 4 3的帐户,并写了一张$ 7 8的支票,这表明你要把- 7 8加到1 4 3上。-7 8
的补数是 9 9 9-7 8 + 1,即9 2 2。所以新的余额是 1 4 3+9 2 2(忽略上溢),即6 5。若我们再写一
张$ 1 5 0的支票,则必须减去1 5 0,用补数表示就是8 5 0。先前的余额0 6 5加上8 5 0等于9 1 5,所以,
新的余额实际上是- $ 8 5。
二进制中对应的系统称为 2的补数 。假设我们用 8位二进制数工作,范围从 0 0 0 0 0 0 0 0~
11111111,对应于十进制的 0~2 5 5。这时如果你想要表达负数,则以 1开头的每个 8位数都表
示一个负数,如下所示:
二进制数 十进制数
1 0 0 0 0 0 0 0 -1 2 8
1 0 0 0 0 0 0 1 -1 2 7
1 0 0 0 0 0 1 0 -1 2 6
1 0 0 0 0 0 11 -1 2 5
111111 0 1 -3
1111111 0 -2
11111111 -1
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1 1
1 0 0 0 0 0 1 0 2
0 11111 0 0 1 2 4
0 11111 0 1 1 2 5
0 111111 0 1 2 6
0 1111111 1 2 7第13章 如何实现减法
下载
111
你可以表示的数的范围从- 1 2 8~1 2 7。最左边的一位称为符号位, 1表示负数, 0表示正
数。
要计算2的补数得先求出 1的补数再加上 1,这等同于先求反再加 1。例如,十进制数 1 2 5是
0 11111 0 1,要用2的补数来表示- 1 2 5,可先取反得1 0 0 0 0 0 1 0,再加1就得到1 0 0 0 0 0 11。可用上
表来验证这个结果。要回到原来的数只需同样的操作:取反后加 1。
这个系统使不用负号就能表示正、负数,它也使我们只用加法规则就可以随意进行正、
负数运算。例如,计算- 1 2 7 + 1 2 4,利用上表即得
1 0 0 0 0 0 0 1
+ 0 1 1 1 1 1 0 0
1 1 1 1 1 1 0 1
和是十进制的- 3。
这里要注意上溢或下溢,即结果大于 1 2 7或小于-1 2 8的情况。例如,1 2 5加1 2 5:
0 1 1 1 1 1 0 1
+ 0 1 1 1 1 1 0 1
1 1 1 1 1 0 1 0
因为最高位是1,结果代表一个负数:- 6。再看-1 2 5加上它自已:
1 0 0 0 0 0 1 1
+ 1 0 0 0 0 0 1 1
1 0 0 0 0 0 1 1 0
由于限制了只取 8位数,所以最左边的 1被扔掉,剩下的 8位表示6。
一般而言,若两个操作数的符号相同,而结果的符号与操作数的符号不相同时,这样的
加法是无效的(即加法运算产生了溢出!)。
现在,二进制数可以有两种不同的使用方法。二进制数可以是无符号的或有符号的,无
符号的二进制 8位数的表示范围从 0~2 5 5,有符号的二进制 8位数的表示范围从- 1 2 8~1 2 7。
这些数本身不会告诉你它们是否带有符号。例如,假设有人问:“1 0 11 0 11 0对应于十进制数的
几?”这时,你必须先问清楚它是无符号数还是有符号数?它可能是 1 8 2或-7 4。
这就是二进制数的麻烦:它们仅仅是一些 0和1而没有告诉它们的任何含义。下载
第14章 反馈与触发器
人人都知道电可以使物体运动。随便看一眼就会发现,很多家用电器中都装了电动机,
如钟、风扇,食品加工机、 C D机等等。电也能使扬声器中的磁芯振动,从而使音响设备、电
视机产生了声音、话音和音乐。不过,电使物体运动的一个最简单、最神奇的例子可能是电
子蜂鸣器和电铃。
将继电器、电池、开关按如下形式连接:
如果你觉得它看起来很奇怪,则你还没有发挥出你的想像力。我们还从未见过如此连接
的继电器。原来的继电器中,输入和输出通常是分开的,这里却构成一个闭环。当闭合开关
时,电路连通了:
接通的电路使电磁铁把金属簧片拉下来(电流的作用):下载
第14章 反馈与触发器
113
当金属簧片改变位置后,电路不再完整,电磁铁失去了磁性,金属簧片又弹回原来的位
置:
这样,电路便又一次接通了。可见,只要开关是闭合的,金属簧片就会上下跳动 —使电
路闭合或断开 — 并制造一种声音。如果金属簧片制造了一种刺耳的声音,它就构成了一个
蜂鸣器。如果金属簧片附上一把小锤子,再加一个金属锣,它就构成了一个电铃。
有两种方法可用来连接继电器以构造一个蜂鸣器,下面是另一种方法的描述:
你可能从上述图中认出了这是第 11章介绍过的反向器,所以电路可以简化为:
输出
对于反向器而言,当输入为 0时,输出为 1;输入为 1时,输出为 0。在该电路中闭合开关
会使反向器中的继电器间断地闭合和断开。如果去掉开关,可以使反向器连续地工作,如下
图示:
输出
这幅图似乎在演示一种逻辑矛盾,反向器的输出是和其输入相反的,但是在这里,其输
出同时又是其输入。需要特别指出的是,反向器实际上是一个继电器,而继电器从一个状态
转换到另一个状态是需要时间的。所以,即使输入和输出是相等的,输出也会很快地改变,
成为输入的倒置(当然,随即输出也就改变了输入,如此反复)。
电路的输出是什么呢?其实就是提供电压和不提供电压之间的变换。或者说输出要么是 0,
要么是1。114
编码的奥秘
下载
这个电路称为振荡器 ,它和我们以前见到的每样东西都有本质上的区别。以前,所有的
电路都靠手动地断开或闭合开关来改变状态,而振荡器却不需要人的干涉,它可以自主地工
作。
当然,单独的一个振荡器不会有什么用,但在本章的后面及接下去的几章里,你会看到
这个电路和其他电路连接后构成了自动控制中一个十分关键的部分。所有计算机都靠某种振
荡器来使其他部件同步工作。
振荡器的输出是 0和1的交替序列,可以用下图形象地来表示它:
图中,水平轴表示时间,垂直轴表示输出是 0或1:
时间
此图表示随着时间的变化,振荡器的输出在 0和1之间交替变化。基于这个原因,振荡器
有时称为时钟(c l o c k),因为通过对振荡次数记数还可确定时间。
那么,振荡器运行的速度有多快呢?也就是说,金属簧片上下跳动的频率是多少?每秒
有多少次呢?很明显,这依赖于继电器是如何构造的。容易想到,一个大的、笨重的继电器
只能迟钝地上下摆动;而一个小的、轻巧的继电器可以迅速地跳动。
我们把振荡器从某个时间的输出开始,经历一段变化又回到同样输出的这一段间隔称为
振荡器的一个循环(c y c l e):
一个循环
时间
一个循环所需要的时间称为振荡器的周期。假设一个振荡器的周期是 0 . 0 5秒,则可以在水
平轴上标出时间:
一个循环
0
0.025 0.05 0.075 0.10 0.125 0.15
时间
振荡器的频率是周期的倒数。本例中,若振荡器的周期是 0 . 0 5秒,则其频率是 1÷0 . 0 5秒,
即每秒钟2 0个循环。这表明振荡器的输出每秒钟改变 2 0次。
每秒循环数与每小时英里数、每平方英寸磅数、每份食物(饮料)的卡路里数等毋需多
解释的术语一样是一个很容易理解的概念,但已不常用。为了纪念第一个发送和接收无线电
波的人 — 鲁道夫・赫兹 ( 1 8 5 7-1 8 9 4 ),我们用“赫兹”这个词表示每秒的循环数。这个用法第14章 反馈与触发器
下载
115
始于2 0世纪2 0年代的德国,后来传到其他国家。
于是,我们可以说这个振荡器的频率是 2 0赫兹,或直接简写为 2 0 H z。
到目前为止,我们只是在假设一个振荡器的速度。到本章末尾,我们可以构造一种器件
来真正地测量一个振荡器的速度。
为了构造这个器件,先看一个用特殊方式连接的一对或非门。或非门的特点是只有两个
输入都为0时,输出才为1:
N O R 0 1
0
1 1
0 0
0
下图是含有两个或非门、两个开关和一个灯泡的电路:
注意图中奇特的连接方式:左边或非门的输出是右边或非门的输入,右边或非门的输出是左
边或非门的输入。这是一种反馈。事实上,这和在振荡器中类似,输出又返回作为一种输入。
这是本章中大部分电路的特点。
在上图电路中,一开始,只有左边或非门的输出有电流,因为它的两个输入均为 0。现在
闭合上面的开关,左边或非门的输出变为 0,于是右边或非门的输出变为 1,灯泡点亮:
神奇之处在于当你断开上面的开关时,由于或非门的输入中只要有一个为 1,其输出就是
0,因而左边或非门的输出不变,灯泡仍然亮着:116
编码的奥秘
下载
你不觉得奇怪吗?两个开关都断开着,和第一幅图一样,但灯泡却亮着。这种情形和以
前所见到的完全不同。通常,一个电路的输出仅仅依赖于输入,这里的情况却不一样。无论
断开或闭合上面的开关,灯泡总是亮着。这里开关对电路没有什么影响,原因是左边或非门
的输出一直是0。
现在闭合下面的开关。由于右边或非门的输入中有一个是 1,则其输出变为 0,灯泡熄灭。
左边或非门的输出此刻变为 1:
现在,再断开下面的开关,灯泡仍旧不亮:
此电路和初始电路一样。然而这回却是下面开关的状态对灯泡没有什么影响。总结起来就是:
• 闭合上面的开关使灯泡点亮,当再断开时,灯泡仍然亮着。
• 闭合下面的开关使灯泡熄灭,当再断开时,灯泡仍然不亮。
电路的奇特之处是:有时当两个开关都断开时,灯泡亮着;而有时,当两个开关都断开
时,灯泡却不亮。当两个开关都断开时,电路有两个稳定状态,这样的一个电路称为触发器。
触发器是 1 9 1 8年在英国射电物理学家 William Henry Eccles(1875-1 9 6 6 )和F. W. J o r d a n的工作中
发明的。
触发器电路可以保持信息,换句话说,它有记忆性。它可以“记住”最近一次是哪个开
关先闭合的。如果你遇到这样一个触发器,它的灯泡亮着时,你可以确定最近闭合的是上面
的开关;而灯泡灭着时则是下面的开关。
触发器和跷跷板很像。跷跷板有两个稳定状态,它不会长期停留在不稳定的中间位置。
你只要一看跷跷板就知道哪边是最近被压下来的。
触发器是十分关键的工具,尽管你现在可能还没看出来。它们赋予电路“记忆”,使其知
道以前曾有过的状态。想像一下,如果你没有记忆力,你该如何去数数,你记不住你刚数过
的数,当然也无法确定下一个数是什么。同样,一个能计数的电路(本章后面要提到)必定
需要触发器。
触发器有很多种,刚才所看到的是最简单的一种,称为 R - S(或 R e s e t - S e t,复位 /置位)
触发器。下面以对称的方式把它重新绘出来:第14章 反馈与触发器
下载
117
用于点亮灯泡的输出称为 Q,另一个输出 -
Q 是Q的倒置。如果 Q是0, -
Q 就是1,反之亦然。
两个输入端S(S e t)和R(R e s e t)分别表示 置位和复位。你可以把“置位”理解为把 Q设为1,
- 变为
而“复位”是把 Q设为0。当S为1时(对应于前面图中闭合上面开关的情况),Q变为1而 Q
0;当R为1时(对应于前面图中闭合下面开关的情况),Q变为0而 -
Q 变为1。当S和R都为0时,
输出保持Q原来的状态。输入与输出的关系小结于下表中:
输入
输出
禁止
这张表称为功能表 、逻辑表 或真值表 。它指明不同的输入组合能产生不同的输出结果。由于
R - S触发器有两个输入端,因而不同的输入组合有 4种,分别对应于表中的 4行。
注意表中倒数第 2行中S和R均为零,而输出标识为 Q和 -
Q 。这表示当 S和R输入均为零时,
Q和 -
Q 端的输出保持 S、R同时设为 0以前的输出值。表中最后一行说明 S和R输入都为 1是非法
- 互为倒置的关系相
的、禁止的。这是因为 S、R同时为1时,两个输出 Q和 -
Q 均为零,这与 Q和 Q
矛盾。所以,当你用 R - S触发器设计电路时,要避免使 R、S输入同时为 1的情况。
R - S触发器通常画成有两个输入,两个输出的方块图,如下图所示:
R - S触发器能够记住哪一个输入端最近被输入高电位,这确实很有趣。但更有用的电路应
该能记住某个特定时间点上上一个信号是 0还是1。
在实际构造这种电路之前,先来思考一下它的行为功能。它需要两个输入,其中一个称
为数据端 (D a t a)。像所有数字信号一样,数据端输入可以是 0或1。另一个输入称为保持位
(Hold that bit)。通常情况下,保持位设为 0,这时,数据端对电路没什么影响。当保持位置
为1时,电路就反映出数据端的值。接着,保持位又置为 0,这时,电路将记住数据端输入的
最近一个值。数据端信号的任何改变不会对电路再有影响。
换句话说,它的功能表可以这样写:
输入
数据端
保持位
输出118
编码的奥秘
下载
在前两种情况下,保持位置为 1,Q端输出和数据端输入相同;后两种情况下,当保持位
置为0时,Q端输出和它以前的值相同,即保持原状态。注意,后两种情况中当保持位为 0时,
Q端输出不再受数据端输入的影响,功能表可以简化表示为:
输出
输入
数据端
保持位
X表示不关心其取值情况,它的值对于电路输出没有影响。
基于R-S 触发器来实现保持位的功能要求在输入端增加两个与门,如下图所示:
复位
保持位
置位
要使与门输出为 1,两个输入端必须同时为 1。在上图中,Q输出为0,而 -
Q 输出为1。
只要保持位置为 0,置位信号对于输出就没有影响:
复位
保持位
置位
同样,复位信号对电路输出也没有影响:
复位
保持位
置位
只有当保持位信号是 1时,电路的功能才和前述的 R - S触发器相同:
复位
保持位
置位第14章 反馈与触发器
下载
119
这时,由于上面与门的输出和复位端输入相同,而下面与门的输出和置位端输入相同,
所以此电路的功能就和普通的 R - S触发器是一样的了。
但我们还没有达到目标,我们只想要两个输入,而不是三个,怎么办呢?前面讲过 R - S触
发器中两个输入同时为 1的情况是禁止的;而两个输入同时为零的情况没有什么意义,因为那
只是输出保持不变的简单情况。这里,只要将保持位置为 0,就可以完成同样的功能。
可见,真正有意义的输入是 S为0,R为1或R为0,S为1。把数据端信号当作置位信号,它
取反后的值就是复位端信号,如下图示:
保持位
数据端
- 为1。只要保持位为 0,数据端输入对于电
在这种情况下, S和R输入以及输出 Q均为0, Q
路输出就没有影响:
保持位
数据端
当保持位为 1时,电路反映出数据端输入的值:
保持位
数据端
- 则相反。现在,保持位又回到 0:
Q端输出现在和数据端输入是一致的, Q
保持位
数据端120
编码的奥秘
下载
这时,电路会记得当保持位最后一次置为 1时数据端输入的值。数据端以后的变化对电路
的输出没有影响:
保持位
数据端
这个电路称为电平触发的 D型触发器 ,D(D a t a)表示数据端输入。所谓电平触发 是指当
保持位输入为某一特定电平(本例中为“ 1”)时,触发器才对数据端的输入值进行保存。(很
快,你将会看到另一种形式的触发器。)
通常情况下,当这样一个电路出现在书中时,输入并不被标为保持位,而是标为“时钟”。
当然,这个信号并不是一个真的时钟,但它有时却具有类似钟一样的属性,即在 0和1之是有
规律地来回变化。但是现在时钟只是用来指示什么时候保存数据:
时钟
数据端
把数据端简写为 D,时钟端简写为 C l k,其功能表如下所示:
输入
输出
这个电路就是所谓的电平触发的 D型锁存器,它表示电路锁存住一位数据并保持至将来使
用。它也可以称为 1位存储器。本书将在第 1 6章中说明如何将多个 1位存储器连起来以构成多
位存储器。
在锁存器中保存多位值是很有用的。假如你想用第 1 2章中的加法机把三个 8位数加起来,
你可以在第 1行开关上输入第一个加数,在第 2行开关上输入第二个加数,但是你必须把第一
次加法运算的结果记录下来,然后以同样方式把记下来的结果和第三个加数再用开关输入。
这是十分麻烦的。
使用锁存器可以解决这个问题。让我们把 8个锁存器集成到一个盒子里,形成一个 8位锁
存器。每个锁存器用到两个或非门、两个与门和 1个反向器。时钟端输入是互相连在一起的。
结果如下图所示:第14章 反馈与触发器
下载
Clk
121
8位锁存器
这个锁存器一次可以保存 8位数。上面的8个输入标为 D 0 ~D 7 ,下面的8个输出标为 Q 0 ~Q 7 。左
边的输入是时钟( C l k),时钟信号通常为 0。当时钟信号为 1时,D端输入被送到 Q端输出。当
时钟信号变为 0时,8位输出值保持不变,直到时钟信号再次被置为 1。8位锁存器也可以画成
下面的样子:
8位锁存器
下面是8位加法器:
8位加法器
通常(先不考虑上一章的减法),8个A输入和8个B输入是连在开关上的, C I(进位输入)
端接地,8个S(和输出)和C O(进位输出)端连着灯泡。
经修改, 8位加法器的输出既与灯泡相连,也作为 8位锁存器的数据端 ( D )输入。标为“保
存”(S a v e)的开关是锁存器的时钟输入,用于保存加法器的运算结果:
开关
开关
8位锁存器
保存
A
B
2-1选择器
输出
8位加法器
灯泡
灯泡
来自锁存器122
编码的奥秘
下载
标识为2 - 1选择器的方块是让你用一个开关来选择加法器的 B端输入是取自第 2排开关还是
取自锁存器的 Q端输出。当选择开关闭合时,就选择了用 8位锁存器的输出作为 B端输入。 2 - 1
选择器用了 8个如下电路:
B
选择
输出
A
如果选择( S e l e c t)端输入为 1,或门的输出和 B端输入是一样的。这是因为上面与门的输
出和B端输入是一样的,而下面与门的输出是 0。同样,如果选择端输入是 0,或门的输出则和
A端输入是一样的。总结起来如下表所示:
输出
输入
输出端
A
B
修改后的加法机中包含了 8个这样的1位选择器。所有选择端的信号输入是连在一起的。
改进过的加法机不能很好地处理进位输出 ( C O )信号。如果两个数的相加使进位输出信号
为1,则当下一个数再加进来时,这个信号就被忽略了。一个可能的解决方法是使加法器、锁
存器、选择器均为 1 6位宽度,或者至少比你可能遇到的最大的和的位数多一位。这个问题会
在第1 7章中专门讲述。
对加法机一个更好的改进方法是完全去掉一排开关,但是这需要先对 D触发器做一点儿小
的改进,对它加一个或门和一个称为清零(C l e a r)的输入信号。清零信号通常为 0,但当它为
1时,Q输出为0,如下图所示:
清零
时钟
数据端
无论其他信号是什么,清零信号总迫使 Q输出为0,起到了给触发器清零的作用。
你也许还不明白为什么要设置这个信号,为什么不能通过把数据端输入置 0和时钟端输入
置1来使触发器清零呢?这也许因为我们并不能控制数据端的输入。下图中, 8个锁存器连着 8
位加法器的输出:第14章 反馈与触发器
下载
123
开关
8位加法器
8位锁存器
清零
相加
灯泡
注意,标识为“相加” ( A d d )的开关此刻控制着锁存器的时钟输入。
你可能会发现这个加法器比前面那个好用,尤其是当你需要加上一长串数字时。刚开始
时,按下清零开关,这个操作使锁存器输出为 0,并熄灭了所有的灯泡,同时使加法器的 B端
输入全为 0。接着,通过开关输入第一个加数,闭合“相加”开关,则此加数反映在灯泡上。
再输入第二个数并再次闭合“相加”开关,由开关输入的 8位操作数加到前面的结果上,其和
输出到灯泡。如此反复,可以连加很多数。
触发器是电平触发式的,意思是说只有在时钟端输入从 0变到1后(即高电平时),数据端
输入的值才能保存在锁存器中。注意,在时钟端输入为 1期间,数据端输入的任何改变都将反
- 端的输出值上。
应在Q或 Q
对一些应用而言,电平触发时钟输入已经足够用了;但对另外一些应用来说,边沿触发
时钟输入更为适用。对于边沿触发器而言,只有当时钟从 0变到1的瞬间,输出才会改变。在
电平触发器中,当时钟输入为 0时,数据端输入的任何改变都不会影响输出;而在边沿触发器
中,当时钟输入为1时,数据端输入的改变也不会影响输出。只有在时钟输入从 0变到1的瞬间,
数据端的输入才会影响边沿触发器的输出。
边沿触发的 D型触发器是由两级 R - S触发器按如下方式连接而成的:
数据端
时钟124
编码的奥秘
下载
这时,时钟输入既控制着第一级,也控制着第二级。但是应该注意到时钟信号在第一级中取
了反,这意味着除了当时钟信号为零时保存数据外,第一级工作原理和 D型触发器完全相同。
第二级的输出是第一级的输入,当时钟信号为 1时,它们被保存。总的结论就是只有当时钟信
号从0变为1时,数据端输入才会保存下来。
让我们进一步分析。下面是处于非工作状态的触发器,其数据端、时钟输入均为 0,Q端
输出也是0:
数据端
时钟
现在,使数据端输入为 1:
数据端
时钟
这改变了第一级触发器状态,因为时钟信号取反后为 1。但第二级仍保持不变,因为时钟
端输入仍为 0。现在把时钟输入变为 1:
数据端
时钟
这就引起第二级触发器改变,使 Q端输出变为 1。与前面不同的是现在无论数据端输入如
何变化(如变为 0),它也不会影响 Q端的输出值:第14章 反馈与触发器
下载
125
数据端
时钟
- 端输出只有在时钟输入从 0变到1的瞬间才发生改变。
Q和 Q
边沿触发的 D型触发器的功能表需要一个新符号来表示这种从 0到1的瞬时变化,即用一个
向上指的箭头(↑)表示:
输入
输出
箭头表示当 C l k信号从0变到1时,Q端输出和数据端输入是一样的,这称为 C l k信号的“正
跳变”(“负跳变”是从 1到0的转换)。触发器的符号图如下所示:
图中的小三角符号表示触发器是边沿触发的。
现在向你展示一个使用边沿触发器的电路。先回忆一下本章开始构造的振荡器,振荡器
的输出是在 0和1之间变化的:
输出
把振荡器的输出连到边沿触发的 D型触发器的时钟输入端,并把 Q 端输出连到自己的 D输
入端:
触发器的输出同时又是它自己的输入。(实际上,这种构造可能是有问题的。振荡器是由
来回迅速转变状态的继电器构成的。振荡器的输出和构成触发器的继电器相连,而这些继电
器不一定能跟上振荡器的速度。为了避免这些问题,这里假设振荡器中继电器的速度比这个
电路中其他地方的继电器的速度都慢。)
观察下面的功能表,就可以明白电路中发生的情况了。刚开始时, C l k输入和 Q端输出都
是0,则 Q 端输出为1,而它和D输入是相连的:126
编码的奥秘
下载
输入
输出
当C l k输入从0变到1后,Q端输出就和 D输入一样了:
输入
输出
但是因为 -
Q 端输出变为 0,因而D输入也变为 0。C l k输入现在是 1:
输入
输出
当C l k信号变回为 0时,不会影响输出:
输入
输出
-
现在C l k信号再变为 1。由于D输入为0,则Q为0且 Q为1:
输入
输出
所以D输入也变为 1:
输入
输出
以上发生的情况总结起来就是:每当 C l k输入从0变到1时,Q端输出就发生改变,或者从 0
变到1,或者从1变到0。看看下面的图,问题就更清楚了:下载
第14章 反馈与触发器
127
当C l k输入从0变到1时,D的值(与 Q 的值是相同的)被输出到 Q端。当下一次 C l k信号从
0变到1时,同样会改变 D和 Q 的值。
若振荡器的频率是 2 0赫兹(即每秒 2 0次循环),则Q的输出频率是它的一半,即 1 0赫兹。
由于这个原因,这种电路 (其中 Q 输出依循触发器的数据端输入 )称为分频器。
当然分频器的输出可以是另一个分频器的 C l k输入,并再一次进行分频。下面是三个分频
器连在一起的情况:
让我们来看一下上图顶部的 4个信号的变化规律:
这里只给出了这幅图的一部分,因为这个电路会周而复始地变化下去。从这个图中,有
没有发现使你眼熟的东西?
提示你一下,把这些信号标上 0和1:
现在看出来了吗?把这个图顺时针旋转 9 0度,读一读横向的 4位数字,每一组输出都对应
了十进制中 0~1 5中的一个数:128
编码的奥秘
下载
二进制 十进制
0 0 0 0
0 0 0 1
0 0 1 0
0 0 11
0 1 0 0
0 1 0 1
0 11 0
0 111
1 0 0 0
1 0 0 1
1 0 1 0
1 0 11
11 0 0
11 0 1
111 0
1111 0
1
2
3
4
5
6
7
8
9
1 0
11
1 2
1 3
1 4
1 5
这个电路只具备了一个计数功能,如果再多加上几个触发器,它就可能计更多的数。第 8
章曾指出在一个递增的二进制数序列中,每一列数字在 0和1之间变化的频率是其右边那一列
数字变化频率的一半,这个计数器模仿了这一点。时钟信号每一次正跳变时,计数器的输出
就递加了1。
可以把8个触发器集成于一个盒子里,构成一个 8位计数器:
8位行波计数量
这个计数器称为 8位行波(异步)计数器,因为每一个触发器的输出都成为下一个触发器
的时钟输入。变化是沿着触发器一级一级地传递的,最后一级触发器的变化必定要延迟一些。
更复杂的计数器是“并行(同步)计数器”,在这种计数器中,所有输出是同时改变的。
输出端信号已标识为从 Q 0 ~Q 7 ,Q 0 是第一个触发器的输出。如果把灯泡连到这些输出上,
就可以把8位结果读出来。
这样一个计数器的时序图可以把 8个输出分开来表示,也可以把它们一起表示,如下图所
示:
时钟信号的每个正跳变发生时,一些 Q输出可能改变,另一些可能不改变,但总体上是使第14章 反馈与触发器
下载
129
原来的结果递增了 1。
本章前面曾提到过可以找到某种方法来确定振荡器的频率,现在这个方法已经找到了。
如果把振荡器连到 8位计数器的时钟输入上,计数器会显示出振荡器经历了多少次循环。当计
数器总和达到 11111111时,它又会返回到 0 0 0 0 0 0 0 0。使用计数器确定振荡器频率的最简单方
法是把计数器的输出连到 8个灯泡上。当所有输出为 0时(即没有一个灯泡点亮),启动一个秒
表;当所有灯泡都点亮时,停住秒表。这就是振荡器循环 2 5 6次所需要的时间。假设是1 0秒钟,
则振荡器的频率就是 2 5 6÷1 0,或者说是 2 5 . 6赫兹。
当触发器功能增加时,它也变得更复杂。下面这个触发器称为具有预置( P r e s e t)和清零
功能的边沿触发的 D型触发器。
清零
预置
时钟
通常情况下,预置和清零信号输入会忽视时钟和数据端输入,且均为 0。当预置信号输入
为1时,Q变为1, Q 变为0。当清零信号为 1时,Q为0, Q 变为1(同R - S触发器中的S和R输入
一样,预置和清零信号不能同时为 1)。其他情况下,该触发器的行为和普通边沿触发的 D型触
发器是一样的。
输入
输出130
编码的奥秘
下载
电路图符号可以简化地用下图代替:
现在,我们已经知道如何用继电器来做加法、减法和计数,是不是很有成就感?因为我
们所用的硬件是 1 0 0多年以前就存在的东西,我们还有更多的空间去探索。但是先暂时休息一
下,不用再去构造什么,回过头来再看看关于数字的问题吧。下载
第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转换成对应二进制数的过程:第15章 字节与十六进制
下载
132
第8章有关于这个方法的更多描述。总之,在十进制数和二进制数之间进行转换通常不是
件十分简单的事。
从第8章中我们还学习了八进制数字系统,八进制数字系统只使用数字 0、1、2、3、4、5、
6、7。在八进制数和二进制数之间进行转换却是小菜一碟,你只要记住每个八进制数字对应 3
位二进制数字即可,如下表所示:
二进制
0 0 0
0 0 1
0 1 0
0 11
1 0 0
1 0 1
11 0
111
八进制
0
1
2
3
4
5
6
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 ......133
编码的奥码
下载
在八进制中,不需要 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:
即使要表示多字节数也很容易:
十六进制数
十进制数第15章 字节与十六进制
下载
134
一个字节总是由一对十六进制数来表示。
不过,我们绝不会真的用橄榄球或匕首来表示十六进制数,事实上,我们用 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 1
0 0 1 0
0 0 11
0 1 0 0
0 1 0 1
0 11 0
0 111
1 0 0 0
1 0 0 1
1 0 1 0
1 0 11
11 0 0
11 0 1
111 0
1111 0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
十进制数
0
1
2
3
4
5
6
7
8
9
1 0
11
1 2
1 3
1 4
1 5
字节1 0 11 0 11 0可以由十六进制数 B 6来表示,而不用再画上一个橄榄球。同前面的章一样,
用下标来表示记数系统的基数,如: 1 0 11 0 11 0 T W O 表示二进制、 2 3 1 2 F O U R 表示四进制、2 6 6 E I G H T 表
示八进制、 1 8 2 T E N 表示十进制、 B 6 S I X T E E N 则表示十六进制。不过,这真是挺麻烦的。还好,有
更简单、更通用的方法来表示十六进制: B 6 H E X 还可以进一步简化为 B 6 h。
在十六进制数中,每一位的位置都对应于 1 6的幂:
1的个数
16的个数
256的个数
4096的个数
65 536的个数
十六进制数 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 h135
编码的奥码
下载
用1 6的乘方表示为:
9A48Ch = 9×1 6 4 +
A×1 6 3 +
4×1 6 2 +
8×1 6 1 +
C×1 6 0
用对应的十进制数代入为:
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位或更少。下面是把这样一
个十进制数转换为十六进制数的一个模板:下载
第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
编码的奥码
下载
可以用这张表和通常的进位规则来对十六进制数做加法:
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章中解释,但是下一步必须先讲
讲存储器。下载
第16章
存储器组织
每天早上,当我们从睡梦中醒来时,记忆会填充大脑的空白。我们会记起我们在哪里,
做过什么,计划做什么。我们可能一下子就能想起来,也可能几分钟都想不起来,不过,总
的来说,我们通常能够重新组织自己的生活,保持高度的连续性,开始新的一天。
当然,人类的记忆是无序的。当回忆高中的几何课时,你可能会想到是谁坐在你前面;
或者那一天当老师要解释什么是 QED(quod erat demonstrandum,证完 /证毕)的时候,刚好进
行消防演习。
人类的记忆也非安全无比。其实,书写的发明就是为了弥补人类记忆的不足。前一天晚
上你可能因为突然冒出的一个关于剧本的好主意而在凌晨三点醒来,抓起床边特地准备的笔
和纸记下来以便不会忘掉,第二天早上你就可以看到这个好主意并开始着手写剧本。当然你
也可以不用这样。
先写后读,先保存后取回,先存储后访问,存储器的作用就是在这两类事件间保证信息
的完好无损。无论什么时候存储信息,都要用到不同类型的存储器。纸是保存文本信息的最
佳媒体,磁带则能很好地保存音乐和电影。
电报继电器 — 当集成为逻辑门然后再集成为触发器 — 也一样可以保存信息。正如我们
所知道的,一个触发器可保存 1位信息。保存 1位信息当然并不代表保存全部信息,但这是一
个开端。一旦我们知道了如何存储 1位信息,就可以容易地存储 2位、3位或更多位信息。
第1 4章曾讲过电平触发的 D型触发器,它由一个反向器、两个与门和两个或非门构成:
时钟
数据端
当时钟输入为1时,Q端输出与数据端输入是相同的。但当时钟输入变为0时,Q端输出将
维持原来的数据端输入,再改变数据端输入不会影响Q端输出,直到时钟输入再次变为1为止。
触发器的逻辑表格如下:
输入
输出
在第1 4章中,这种触发器的功能体现在两个不同的电路中。而在本章,它仅以一种方式
来使用 — 即用于保存 1位信息。正因为如此,给输入端和输出端重新命名,以便与该目的更
为一致。第16章 存储器组织
下载
139
数据输出
写入
数据输入
这是同一个触发器,但现在 Q输出端命名为数据输出(Data Out),时钟输入端(在第 1 4
章是作为保持位)命名为写入(Wr i t e)。就像可以在纸上记录信息一样,写入信号使得数据
输入(Data In)信号写入或存储到电路中。通常,若写入信号 ( W )为0,则数据输入 ( D I )信号
对输出无影响。而当我们想在触发器中存储数据输入信号时,写入信号应先置 1后置0。就像
在第1 4章提到的,这种类型的电路也叫锁存器,因为它锁定数据。下面画出了一个 1位锁存器,
但没有画出其所包含的单个部件:
把多个1位锁存器连成多位锁存器是相当容易的,只需连接好写入信号:
写入
输入
输出
该8位锁存器具有 8个输入端和 8个输出端。另外,这个锁存器有一个写入输入端,通常为
0。要在这个锁存器中存储一个 8位二进制数,应将写入信号先置 1后置0。也可以把这个锁存
器画成一个整体,就像这样:
8位锁存器
为了与1位锁存器一致,也可以画成这样:140
编码的奥秘
下载
数据输入
8位锁存器
数据输出
写入
另外一种集成 8个1位锁存器的方法不像上述这么直接。假设只想用一个数据输入信号端
和一个数据输出信号端,且又希望它具备在一天或一分钟内存储 8次数据输入信号的能力。同
时,也希望能通过检测这个数据输出信号端就可以检查这 8个数据。
换句话说,我们只想存储 8个单独的1位数,而不想在 8位锁存器中存储 1个8位数。
为什么会有这种想法呢?可能是因为我们仅有一个灯泡的缘故吧!
我们知道这需要 8个1位锁存器。先不要考虑这些数据是怎样存储在这些锁存器中的,先
让我们把注意力放在如何用一个灯泡来检查 8个锁存器的数据输出信号上。当然,我们通常用
手工把灯泡从一个锁存器移到另一个锁存器来测试各个锁存器的输出,不过,我们更倾向于
用更自动化的方法来实现。实际上,我们打算用开关来选择想要检查的锁存器。
那么,需要多少个开关呢?若是 8个锁存器,则需要 3个开关。 3个开关可表示 8个不同的
值:0 0 0、0 0 1、0 1 0、0 11、1 0 0、1 0 1、11 0和111。
目前已有8个1位锁存器、3个开关、1个灯泡,此外还有“其他东西”用在开关和灯泡之间:
这是什么?
这个“其他东西”就是标识为“这是什么?”的神秘盒子,它上面有 8个输入端,左侧有
3个输入端。通过闭合和断开这三个开关,就可以从 8个输入中选择一个,使其经过底部至输
出端输出,该输出使灯泡发光。
“这是什么?”到底是什么呢?我们以前曾见过类似的东西,尽管没有这么多的输入端。
它类似于第 1 4章中第一个改进的加法机里用到的电路。那时我们需要某种东西用于是选择一
行开关还是选择一个锁存器的输出作为加法器的输入,我们把这种东西叫 2 - 1选择器,这里需
要8 - 1选择器:第16章 存储器组织
下载
141
数据输入
选择输入
8-1选择器
输出
8 - 1选择器具有 8个数据输入端(显示在上部)和 3个选择输入端 (Select Input)(显示在左
侧),选择输入端用于选择哪个输入数据在输出端输出。例如,若选择输入端为 0 0 0,则输出
D 0 的值;若选择端为 111,则输出D 7 的值;若选择端为 1 0 1 ,则输出D 5 的值。其逻辑表如下:
输入
输出
8 - 1选择器由三个反向器、八个 4输入与门和一个 8输入或门构成,如下所示:
输出
这是一个相当复杂的电路,但只需一个例子就可以使你明白它是如何工作的。假设
S 2 = 1 , S 1 = 0 , S 0 = 1,从上面数第六个与门的输入包括 S 0 、-
S 1 、S 2 ,它们全为 1。没有其他与门有同
样的三个输入信号,因此,其他与门输出全部为 0。若D 5 =0,则第六个与门输出为 0;若D 5 =
1,则其输出为1。对最右边的或门来说也是如此。因此,若选择端为 1 0 1,则输出为 D 5 。142
编码的奥秘
下载
概括一下我们想干什么。我们想连接 8个1位锁存器,它们能够通过一个数据输入信号端
分别写入,也能通过一个数据输出信号端分别检查。已经证明可以用一个 8 - 1选择器从 8个锁
存器中选择一个数据输出信号,如下图所示:
8-1选择器
输出
到现在已完成了任务的一半。我们已经实现了输出端的要求,现在再来看一下输入端。
输入端包括数据输入信号及写入信号。在锁存器的输入端,可以把所有数据输入信号连
接在一起。但不能把 8个写入信号也都连在一起,因为我们还想分别向每个锁存器中写入数
据。此外,还要有一个单独的写入信号,它必须能连到其中任一个(并且只能是一个)锁存
器上:
数据输入
写入
这是什么?
为了完成这项工作,需要另外一个电路,这个电路看起来与 8 - 1选择器有点相似,但实际
上却正好相反。这就是 3 - 8译码器。前面我们曾见过简单的数据译码器 — 第11章曾通过连接
开关来选择理想的猫的颜色。
3 - 8译码器有 8个输出端。任何情况下,锁存器除了一个输出端外,其余的均为 0。这个例
外是由S 0 、S 1 、S 2 输入信号所选择的输出端。该输出端输出的也是数据输入端的输入:第16章 存储器组织
下载
143
数据输入
-
再说一遍,从上面数第六个与门的输入包括 S 0 、 S 1 、S 2 ,没有另外的与门有同样的三个输
入。若选择输入端为 1 0 1,则其他与门输出都为 0。若数据输入为 0,则第六个与门输出为 0;
若数据输入为1 ,则其输出为 1。其逻辑表格如下:
输出
输入
数据
数据
数据
数据
数据
数据
数据
数据
下面是具有 8个锁存器的完整电路:
地址
写入
数据
3-8译码器
8-1选择器
输出
数据输出
数据输入144
编码的奥秘
下载
注意,译码器和选择器的三个选择信号相同,现在这三个信号都记作 地址(A d d r e s s)。
就像信箱号一样, 3位地址决定了选择 8个锁存器中的哪一个。在输入端,地址输入决定写入
信号触发哪一个锁存器来存储输入的数据。在输出端(图的下部),地址输入控制 8 - 1选择器
选择8个锁存器中的一个进行输出。
这种锁存器的配置有时也称为读/写存储器,但通常叫作随机访问存储器或 R A M。R A M
可存储8个单独的1位数据,如下图所示:
地址
数据输入
数据输出
写入
称它为存储器是因为它能保存信息,称为读/写存储器是因为可以在每个锁存器中保存
新的数据(也就是写数据),同时还可以查看每个锁存器中所保存的数据(也就是读数据)。
称它为随机访问存储器是因为通过简单地改变地址输入就可以从 8个锁存器中的任意一个读出
或写入数据。相比之下,其他类型的存储器必须顺序读出 — 也就是,在可以读出存储在地
址1 0 1的数据之前,必须读出存储在地址 1 0 0的数据。
R A M配置通常称作 R A M阵列,上述这种特定配置的 R A M阵列以简写形式8×1的方式组织
起来。阵列中可以存放8个数,每个仅占1位,R A M阵列中能存储的位数等于这两个值的乘积。
R A M阵列可通过各种方法来组合。例如,可以把两个 8×1 RAM 阵列连接起来,使它们
按照相同的方法来寻址:
地址
数据输入
数据输出
写入
数据输入
数据输出
这两个8×1 RAM 阵列的地址和写入输入端连接在一起,所以其结果为一个 8×2 RAM阵
列:
地址
数据输出
数据输入
写入第16章 存储器组织
下载
145
这个R A M阵列可存储 8个数,但每个数占 2位。
两个8×1 RAM阵列也可以按照与单个锁存器连接相同的方式 — 通过一个2 - 1选择器和一
个1 - 2译码器 —来组合,如下图所示:
写入
地址
数据输入
选择
1-2译码器
2-1选择器
数据输出
连接到译码器和选择器的选择( S e l e c t)输入实质上选择两个 8×1 RAM阵列中的一个,
在这里它也就是第 4根地址线。所以,该图实际上是一个 1 6×1 RAM 阵列:
地址
数据输出
数据输入
写入
此R A M阵列可存储 1 6个数,每个数占 1位。
R A M阵列的存储容量与地址输入端数目有直接关系。无地址输入端时(即 1位锁存器和 8
位锁存器这种情况),只能存1个数;有一个地址输入端时,可存 2个数;有两个地址输入端时,
可存4个数;有三个地址输入端时,可存 8个数;有四个地址输入端时,可存 1 6个数。其关系
可归纳成如下等式:
RAM 阵列的存储容量 = 2 地址输入端数目
上面已讲了如何构造小的 RAM 阵列,那么再规划大的 RAM 阵列应该并不困难。例如:
地址
数据输入
写入
数据输出146
编码的奥秘
下载
这个R A M阵列可存储 8 1 9 2位信息,按 1 0 2 4个数、每个 8位来组织。因为 1024 = 2 1 0 ,所以
它有1 0条地址线。此外,它有 8个数据输入端和 8个数据输出端。
换句话说,这个 RAM 阵列可存储 1 0 2 4个字节。就像一个邮局有 1 0 2 4个邮箱,每个信箱中
有一个不同的1字节数。
1 0 2 4个字节即 1K 字节(k i l o b y t e),1 K字节在此会引起许多混淆。公制里前缀 k(来自于
希腊文k h i l i o i ,意思为1千)经常用到,如 1 k g = 1 0 0 0 g , 1 k m = 1 0 0 0 m。但这里所说的 1 K字节= 1 0 2 4
字节 — 而非1 0 0 0字节。
原因在于公制是基于 1 0的幂,而二进制是基于 2的幂,这两种进制永远不会有相同的值。
1 0的整数次幂为 1 0、1 0 0、1 0 0 0、1 0 0 0 0、1 0 0 0 0 0等,而2的整数次幂为 2、4、8、1 6、3 2、6 4
等,没有1 0的整数次幂与2的整数次幂相等的情况。
但有时它们非常接近。的确, 1 0 0 0非常接近1 0 2 4,可以用“约等于 (≈)”符号进行数学化
表示:
2 1 0 ≈1 0 3
这个关系式并非不可思议,它只不过表明 2的某次幂等于 1 0的某次幂而已。这种特例允许
人们方便地把1 0 2 4字节称作1 K字节。
K字节简写为 K或K B。所以,上面展示的 R A M阵列存储1 0 2 4字节或1 K ( 1 K B )。
不能把1 K B的R A M阵列说成是存储 1 0 0 0字节,它大于 1 0 0 0,即1 0 2 4,为了让人知道你在
说什么,你可以把它说成“ 1 K”或“1 K字节”。
1 K字节的存储器具有 8个数据输入端, 8个数据输出端和 1 0个地址输入端。由于是通过 1 0
条地址线来访问字节,所以 R A M阵列可存储 2 1 0 个字节。无论何时再加上一条地址线,其存储
容量将翻倍。下面每一行都都表示存储容量的翻番:
1KB = 1024B = 2 1 0 B≈1 0 3 B
2KB = 2048B = 2 11 B
4KB = 4096B = 2 1 2 B
8KB = 8192B = 2 1 3 B
16KB = 16 384B = 2 1 4 B
32KB = 32 768B = 2 1 5 B
64KB = 65 536B = 2 1 6 B
128KB = 131 072B = 2 1 7 B
256KB = 262 144B = 2 1 8 B
512KB = 524 288B = 2 1 9 B
1024KB = 1 048 576B = 2 2 0 B ≈ 1 0 6 B
可以看出左侧的数字也是 2的整数次幂。
按照同样的逻辑,我们能把 1 0 2 4字节称作 1 K B ,当然也可以把 1 0 2 4 K B称作 1 M 字节
(m e g a b y t e,希腊文m e g a s意思为大),M字节缩写为 M B。以下仍是存储容量翻番的式子:
1MB = 1 048 576B = 2 2 0 B≈1 0 6 B
2MB = 2 097 152B = 2 2 1 B
4MB = 4 194 304B = 2 2 2 B第16章 存储器组织
下载
147
8MB = 8 388 608B = 2 2 3 B
6MB = 16 777 216B = 2 2 4 B
32MB = 33 554 432B = 2 2 5 B
64MB = 67 108 864B = 2 2 6 B
128MB = 134 217 728B = 2 2 7 B
256MB = 268 435 456B = 2 2 8 B
512MB = 536 870 912B = 2 2 9 B
024MB = 1 073 741 824B = 2 3 0 B≈1 0 9 B
希腊文g i g a s意思为巨大,所以把 1 0 2 4 M B称作1 G字节( g i g a b y t e ),缩写为G B。
同样,1 T字节( t e r a b y t e,希腊文 t e r a s意思为庞然大物)等于 2 4 0 字节(约 1 0 1 2 )或1 099 511
627 776B,terabyte缩写为T B。
1KB约为1000B,1MB约为1 000 000B,1GB约为1 000 000 000B,1TB约为1 000 000 000 000B。
再大的数就很少用了,如 1 P B(p e t a b y t e)= 2 5 0 B或1 125 899 906 842 624字节,约等于
1 0 1 5 。1 E B ( e x a b y t e ) = 2 6 0 B或1 152 921 504 606 846 976字节,约等于1 0 1 8 。
下面提供一些基本常识。在此书编写的时候( 1 9 9 9年),家用电脑一般都配有 3 2 M B或
6 4 M B或1 2 8 M B的随机访问存储器(为不至于混淆,这里不谈任何关于硬盘驱动器的事情,而
只谈论R A M),即33 554 432B或67 108 864B或134 217 728B。
当然,人们总拣方便的讲。有 65 536字节内存的人会说“我有 6 4 K”;有33 554 432字节
的人会说“我有 3 2 M”。虽说不多,但有 1 073 741 824字节的人也会说“我有 1 G”。
有时人们可能会提到 K位或M位(注意是位而不是字节),不过这很少见。人们谈到存储
器时,几乎总是指字节数而非位数。
(当然,把字节转换成位,乘 8即可。)在线路传送数据时,
通常会有这样的短语每秒千位( k b p s )或每秒兆位(m b p s )出现。例如, 5 6 K的调制解调器指的是
5 6 K b p s ,而非每秒千字节。
至此我们已经明白如何构造所需的 R A M阵列,但不要离题太远。现在让我们看一下已经
集成了65 536字节的存储器:
地址
数据输入
数据输出
写入
为什么是6 4 K B而非3 2 K B或1 2 8 K B?因为65 536是一个整数,刚好为2 1 6 B,也即该R A M阵列
有1 6位地址。换句话说,该地址正好是 2个字节。用十六进制来表示其地址范围是 0 0 0 0 h~
FFFFh.
6 4 K B的内存在1 9 8 0年的P C机上是比较普遍的配置,尽管它不是用电报继电器制成的。但
是,你真的能用继电器来实现吗?肯定不能。因为按照我们的设计方案需要为每位存储器提
供9个继电器,那么 6 4 K×8的R A M阵列需要将近5 0 0万个继电器。
利用控制面板来操作所有的存储器 — 写入数据到存储器或验证写入的数据 — 将更加先
进。这种控制面板用 1 6个开关来表示地址, 8个开关来表示需要输入存储器的 8位数据, 8个灯148
编码的奥秘
下载
泡来显示8位数据,再用一个开关来表示写入信号,如下图所示:
控制面板
接管
写入
所有的开关均显示在 0位置。另外,还有一个标识为接管 ( t a k e o v e r )的开关,使用这个开关
的目的是使其他电路可以使用与控制面板相连的同一个存储器。当接管开关置0时(如图所示),
控制面板上的其余开关将不起任何作用;而当此开关置 1时,控制面板将对存储器进行专门控
制。
这些都可以用若干 2 - 1选择器来实现。实际上,需要 2 5个— 1 6个接地址信号、 8个接数据
输入开关、另外 1个接写入开关。其电路如下:
写入
数据
输入
地址
25个开关
接管
25个2-1选择器
8个灯泡
数据输出
当接管开关断开时(如上图),6 4 K×8 RAM阵列的地址、数据输入和写入信号来自于外
部信号,显示在 2 - 1选择器的左上角;当接管开关闭合时, R A M阵列的地址、数据输入和写入
信号来自于控制面板开关传来的信号。无论哪种情况, R A M阵列的数据输出信号传到 8个灯
泡上或其他可能的地方。
下图是带有控制面板的 6 4 K×8 RAM 阵列:第16章 存储器组织
下载
149
控制面板
地址
数据输入
数据输出
写入
当接管开关闭合时,可用 1 6个地址开关来选择 65 536 个地址中的任何一个,而灯泡将显
示当前地址中所存的 8位数据。可用 8个数据开关来定义一个新数,并通过写入开关把它写入
存储器中。
通过6 4 K×8 RAM阵列和控制面板可以与需要处理的 65 536个8位数据中的任何一个保持
联系。但我们也留了一些机会让别的东西 — 也许是其他一些电路 — 使用存在存储器中的数
据,或者把数据写入存储器。
还有一个必须注意的有关存储器的问题,它非常重要。在第 11章介绍逻辑门的概念时,
并未画出构成逻辑门的单个继电器的构造。特别地,没有标出每个继电器连接的电源。任何
时候当继电器触发时,电流流过电磁线圈并在适当的位置吸下金属簧片。
如果一个装满65 536字节的6 4 K×8 RAM阵列被关掉电源,将会发生什么情况呢?所有的
电磁铁将失去磁性,所有继电器的触点将回到未触发状态, R A M中的内容也将永远丢失。
这就是随机访问存储器也称为易失性存储器的原因,它需要恒定的电源来保持其中的内
容。下载
第17章 自 动 操 作
人类是非常富于创造性而且是十分勤勉的,但是,人类在本质上也是十分懒惰的。非常
明显,人类并不愿意去工作,这种对工作的反感导致人们用大量的时间来设计和制造可以把
工作日缩短到几分钟的设备。幻想使人感到兴奋,甚至远比我们所看到新奇的事物更令人兴
奋得多。
当然不会在这里介绍自动割草机的设计。本章将通过设计更精密的机器,使加减法运算
更加自动化,这听起来也许有些不可思议。本章最后设计出的机器将具有广泛的用途,它实
际上可以解决任何利用加减法的问题,这些问题的范围太大了。
当然,由于精密机器越来越复杂,因此有些部分可能会很粗糙。不过如果你略过了某些
困难的细节,没有人会责备你。有时,你可能会不耐烦并且发誓再也不会因为一个数学问题
而去寻求电或机械的帮助。不过请耐心坚持到底,因为本章最后将发明一个叫作计算机的机
器。
我们曾在第 1 4章见过一个加法器。它有一个 8位锁存器,累加由 8个开关输入的数的和:
开关
8位加法器
8位锁存器
清零
相加
灯泡
前面曾讲过, 8位锁存器用触发器来保存 8位数据。使用这个设备时,必须首先按下清零
开关使锁存器的存储内容清零,然后用开关来输入第一个数字。加法器简单地把这个数字与
锁存器输出的零相加,因此其结果就是你刚输入的数字。按下相加开关可在锁存器中保存该
数并且通过灯泡显示出来。现在从开关上输入第二个数,加法器把这个数与存储在锁存器中
的数相加,再按下相加开关把总和存储在锁存器中并通过灯泡显示出来。通过这种方法,你
可以加上一串数字并显示出运算总和。当然,其中存在的一个局限是 8个灯泡不能显示总和超
过2 5 5的数。
第1 4章介绍该电路的时候,只讲到一种锁存器,它是电平触发的。在电平触发的锁存器
中,时钟输入端必须先置 1然后回到 0,才能使锁存器保存数据。当时钟信号等于 1时,锁存器
的数据输入可以改变,这种改变将会影响所保存的数据输出。第 1 4章的后面又介绍了边沿触
发的锁存器,这种锁存器在时钟输入从 0变化到 1的瞬间保存数据。由于边沿触发的锁存器易第17章 自 动 操 作
下载
151
于使用,所以假定本章用到的锁存器为边沿触发的锁存器。
用于累加数字的锁存器叫作累加器,本章后面将会看到累加器并非仅仅进行简单的累加。
累加器通常是一个锁存器,保存第一个数字,然后该数字又加上或减去另一个数字。
上面这个加法机存在的最大问题已经相当明显:如果想把 1 0 0个二进制数加起来,你就得
坐在加法机前耐着性子输入每一个数字并累加起来。当你完成时,却发现有两个数字是错误
的,你只好又重复全部的工作。
不过,也可能并非如此。上一章用了差不多 5 0 0万个继电器来构造一个 6 4 K B的R A M阵列。
另外,我们还连接了一个控制面板,用来闭合接管开关接通线路,并使用开关进行 R A M阵列
的写入和读出。
控制面板
地址
数据输入
数据输出
写入
如果你向 R A M阵列中输入 1 0 0个二进制数字,而不是直接输入到加法机中,那么进行数
据修改会容易得多。
现在我们面临着一个挑战,即如何将R A M阵列连到累加器上。显而易见,R A M的数据输出
信号应该代替累加器的开关组。但是,用一个 1 6位的计数器(正如在第 1 4章构造的)就可以控
制R A M阵列的地址信号。在下面这个电路中,连到RAM 的数据输入信号和写入信号可以不要:
控制面板
振荡器
16位计数器
8位加法器
清零
8位锁存器
灯泡
当然这并非已经发明的最容易操作的计算装置。在使用之前,必须先闭合清零开关,以
清除锁存器的内容并把 1 6位计数器的输出置为 0 0 0 0 h,接着闭合 R A M控制面板上的接管开关。
你可以从 R A M地址的 0 0 0 0 h处开始输入一组想要加的 8位数,如果有 1 0 0个数,则它们保存在
从0 0 0 0 h~0 0 6 3 h的地址中(也可以把 R A M阵列中没有用到的单元都设置为 0 0 h)。然后断开152
编码的奥秘
下载
R A M控制面板上的接管开关(这样控制面板不会再对 R A M阵列起控制作用了),并断开清零
开关。这时,你就只需坐着看灯泡的亮灭变化了。
其工作情况为:当清零开关第一次断开时, R A M阵列的地址输入为 0 0 0 0 h,保存在 R A M
阵列当前地址的 8位数是加法器的输入。由于锁存器也清零,所以加法器的另 8位输入为0 0 h。
振荡器提供时钟信号 — 一个在0和1之间迅速交替变化的信号。在清零开关断开后,当时
钟由0变为1时,将同时发生两个事件:锁存器保存来自加法器的结果;同时, 1 6位计数器加1,
指向R A M阵列的下一个地址。在清零开关断开后,当时钟第一次由 0变为1时,锁存器保存第
一个数,同时,计数器增加到 0 0 0 1 h;当时钟第二次由 0变为1时,锁存器保存第一个数与第二
个数之和,同时计数器增加到 0 0 0 2 h;依此类推。
当然,这里先做了一些假设,首要一点,振荡器需慢到允许电路的其余部分可以工作。
对于每次时钟振荡,在加法器输出端显示有效和之前,许多继电器必须触发其他继电器。
这种电路有一个问题,即没有办法让它停止。到一定时候,灯泡会停止闪动,因为 R A M
阵列中的其余数都为 0 0 h。这时,你可以看到二进制和。但当计数器最终到达 F F F F h时,它又
会翻到0 0 0 0 h(就像汽车里程表),这时自动加法器又会开始把这些数加到已经计算过的和中。
这种加法机还有一个问题:它只能用于加法,并且只能加 8位数。不仅在R A M阵列中的每
个数不能超过 2 5 5,而且其总和也不能超过 2 5 5。这种加法器也没有办法进行减法运算。虽然
可以用2的补码表示负数,但是在这种情况下,加法器只能处理- 1 2 8~1 2 7之间的数字。让它
处理更大数字(例如, 1 6位数)的一种显而易见的方法就是使 R A M阵列、加法器和锁存器的
宽度加倍,同时再提供 8个灯泡。不过你可能不太愿意做这种投资。
当然,要不是我们最终要去解决这些问题,这儿是不会提到这些问题的。不过我们首先
想谈的却是另外一个问题。如果不是要把 1 0 0个数加成一个数,会怎么样?如果只想用自动加
法器把 5 0对数字加成 5 0个不同的结果又会怎么样?也许你希望有一个万能的机器来累加多对
数字、1 0个数字或1 0 0个数字,并且希望所有的结果都可方便地使用。
前面提到的自动加法器在与锁存器相连接的一组灯泡上显示出其相加结果。对于把 5 0对
数字加成 5 0个不同的和来说,这种方法并不好。你可能希望把结果存回 R A M阵列中,然后,
在方便的时候用 R A M控制面板来检查结果。控制面板上有专门为此目的而设计的灯泡。
这意味着连接在锁存器上的灯泡可以去掉。不过,锁存器的输出端必须连接到 R A M阵列
的数据输入端上,以便于和可以写入到 R A M中:
控制面板
16位计数器
8位加法器
8位锁存器第17章 自 动 操 作
下载
153
上图中省略了自动加法器的其余部分,特别是振荡器和清零开关,因为不再需要显著标
出计数器和锁存器的清零和时钟输入来源。此外,既然我们已经充分利用了 R A M的数据输入
端,就需要有一种方法来控制 R A M的写入信号。
我们不去考虑这个电路能否工作,而把重点放在需要解决的问题上。当前需要解决的问
题是能配置一个自动加法器,它不会仅用来累加一串数字。我们希望能随心所欲地确定累加
多少数字、在R A M中存储多少不同的结果以供日后检查。
例如,假设我们希望先把三个数字加在一起,然后把另两个数字加在一起,最后再把另
外三个数加在一起。我们可能会将这些数字存储在从地址 0 0 0 0 h开始的 R A M阵列中,存储器
的内容如下所示:
第一个和放在这里
第二个和放在这里
第三个和放在这里
这是本书第 1 6章所说明的内容。方格里是存储单元中的内容,存储器的每一个字节在一
个方格中。方格的地址在方格左面,并非每一个地址都要表示出来,存储器的地址是连续的,
因而可以算出某个方格的地址。方格的右侧是关于这个存储单元的注释,它们表示出我们希
望自动加法器在这些空格中存储三个结果。(虽然这些方格是空的,但存储单元并非空的。存
储单元中总有一些东西,即使只是随机数,但此时它不是有用的数。)
现在可以试一下十六进制算术运算并且把结果存到方格中,但这并不是此项试验的要点,
我们想让自动加法器来做一些额外的工作。
不是让自动加法器只做一件事情 — 在最初的加法器中,只是把 R A M地址中的内容加到
称为累加器的 8位锁存器中 — 实际上是让它做四件不同的事。要做加法,需先从存储器中传
送一个字节到累加器中,这个操作叫作 L o a d(装载)。第二项所要执行的操作是把存储器中的
一个字节加 ( A d d )到累加器中。第三项是从累加器中取出结果,保存 ( S t o r e )到存储器中。最后,
需要有一些方法使自动加法器停止 ( H a l t )工作。
详细说来,让自动加法器所做的工作如下所示:
• 把地址0 0 0 0 h中的数装载到累加器中
• 把地址0 0 0 1 h中的数加到累加器中
• 把地址0 0 0 2 h中的数加到累加器中
• 把累加器中的数保存到地址 0 0 0 3 h中
• 把地址0 0 0 4 h中的数装载到累加器中154
编码的奥秘
下载
• 把地址0 0 0 5 h中的数加到累加器中
• 把累加器中的数保存到地址 0 0 0 6 h中
• 把地址0 0 0 7 h中的数装载到累加器中
• 把地址0 0 0 8 h中的数加到累加器中
• 把地址0 0 0 9 h中的数加到累加器中
• 把累加器中的数保存到地址 0 0 0 A h中
• 停止自动加法器的工作
注意,同最初的自动加法器一样,存储器的每个字节的地址是连续的,开始处为 0 0 0 0 h。
以前自动加法器只是简单地把存储器中相应地址的数加到累加器中。某些情况下,现在仍然
需要这样做,但有时我们也想直接把存储器中的数装载到累加器中或者把累加器中的数保存
到存储器中。在所有事情都完成以后,我们还想让自动加法器停下来以便检查 R A M阵列中的
内容。
怎样完成这些工作呢?只是简单地键入一组数到 R A M中并期望自动加法器来正确操作是
不可能的。对于 R A M中的每个数字,我们还需要一个数字代码来表示自动加法器所要做的工
作:装载,加,保存或停止。
也许最容易(但肯定不是最便宜)的方法是把这些代码存储在一个完全独立的 R A M阵列
中。这第二个 RAM 阵列与最初的 R A M阵列同时被访问,但它存放的不是要加的数,而是用
来表明自动加法器将要对最初的 R A M阵列的相应地址进行某种操作的代码。这两个 R A M阵列
可以分别标为数据(最初的 R A M阵列)和代码(新的 R A M阵列):
控制面板
代码
16位计数器
控制面板
数据
已经确认新的自动加法器能够把“和”写入到最初的 R A M阵列(标为数据),而要写入新
的R A M阵列(标为代码)则只能通过控制面板来进行。
我们用4个代码来表示自动加法器希望能实现的 4个操作。 4个代码可任意指定,下面为可
能的一组代码:第17章 自 动 操 作
下载
操作码
155
代码
L o a d(装载)
Store (保存)
Add ( 加)
Halt ( 停止)
1 0 h
11 h
2 0 h
F F h
为了执行以上例子中提到的三组加法,需要用控制面板把下面这些数保存到代码 R A M阵列中:
你可能想把这个 R A M阵列中的内容与存放累加数据的 R A M阵列的内容作一比较。你会发
现代码 R A M中的每个代码或者对应于数据 R A M中一个要装入或加到累加器的数,或者表示
一个要存回到存储器中的数。这样的数字代码通常称作指令码或操作码,它们“指示”电路
执行某种“操作”。
前面谈到过,早期自动加法器的 8位锁存器的输出需要作为数据 R A M阵列的输入,这就
是“保存”指令的功能。另外还需要一个改变:以前, 8位加法器的输出是作为锁存器的输入,
但现在为了实现“装载”指令,数据 R A M的输出有时候也要作为 8位锁存器的输入,这种改
变需要2 - 1数据选择器。改进的自动加法器如下图:
控制面板
代码
16位计数

控制面板
数据
8位加法

2-1选择器
8位锁存
器156
编码的奥秘
下载
上图中少了一些东西,但它显示了各种组件间的 8位数据通路,一个 1 6位计数器为 2个
R A M阵列提供地址。通常,数据 RAM 阵列输出到 8位加法器上执行加法指令。 8位锁存器的
输入可能是数据 R A M阵列的输出也可能是加法器的输出,这需要 2 - 1选择器来选择。通常,
锁存器的输出又流回到加法器,但对“保存”指令而言,它又作为数据 R A M阵列的输入。
上图中缺少的是控制这些组件的信号,统称为控制信号。它们包括1 6位计数器的时钟(C l k)
和清零( C l r )输入,8位锁存器的C l k和C l r输入,数据 R A M阵列的写入( W )输入以及2 - 1选择器的
选择( S )输入。其中有一些信号明显基于代码 RAM 阵列的输出,例如,若代码 RAM 阵列的输
出表示装载指令,则2 - 1选择器的S输入必须为0(选择数据R A M阵列的输出)。仅当操作码为保
存指令时,数据R A M阵列的W输入才为1。这些控制信号可以由逻辑门的各种组合来产生。
利用最小数量的附加硬件和新增的操作码,也能让这个电路从累加器中减去一个数。第 1
步是扩充操作码表:
操作码 代码
L o a d
S t o r e
A d d
S u b t r a c t (减)
H a l t 1 0 h
11 h
2 0 h
2 1 h
FFh
加法和减法只通过操作码的最低有效位来区分。若操作码为 2 1 h,除了在数据 R A M阵列
的输出数据输入到加法器之前取反并且加法器的进位输入置 1外,电路所做的几乎与电路执行
加法指令所做的完全相同。在下面这个改进的有一个反相器的自动加法器里, C 0 信号可以完
成这两项任务:
控制面板
代码
16位计数

控制面板
数据
反相器
8位加法器
2-1选择器
8位锁存器第17章 自 动 操 作
下载
157
现在假设把 5 6 h和2 A h相加再减去 3 8 h,可以按下图所显示的存储在两个 R A M阵列中的操
作码和数据进行计算:
“代码”
“数据”
结果放在此处
装载操作完成后,累加器中的数为 5 6 h。加法操作完成后,累加器中的数为 5 6 h加上2 A h的
和,即8 0 h。减法操作使数据 R A M阵列的下一个数( 3 8 h)按位取反,变为 C 7 h。加法器的进
位输入置为 1时,取反的数C 7 h与8 0 h相加:
C 7 h
+ 80h
+ 1h
4 8 h
其结果为4 8 h。(按十进制,8 6加4 2减5 6等于7 2。)
还有一个未找到适当解决方法的问题是加法器及连到其上的所有部件的宽度只有 8位。以
往唯一的解决方法就是连接两个 8位加法器(或其他的两个部件),形成1 6位的设备。
但也有更便宜的解决方法。假设要加两个 1 6位数,例如:
7 6 A B h
+ 232Ch
这种1 6位加法同单独加最右边的字节(通常称作低字节):
A B h
+ 2Ch
D 7 h
然后再加最左边的字节,即高字节
7 6 h
+ 23h
99h
得到的结果一样,为 9 9 D 7 h。因此,如果像这样把两个 1 6位数保存在存储器中:
“代码”
“数据”
低字节结果
高字节结果158
编码的奥秘
下载
结果中的D 7 h存在地址0 0 0 2 h中,9 9 h存在地址0 0 0 5 h中。
当然,并非所有的数都这样计算,对上例中的数是这样计算。若两个 1 6位数7 6 A B h和
2 3 6 C h相加会怎么样呢?在这种情况下, 2个低字节数相加的结果将产生一个进位:
A B h
+ 6Ch
11 7 h
这个进位必须加到 2个高字节数的和中:
1 h
+ 76h
+ 23h
9 A h
最后的结果为9 A 1 7 h。
可以增强自动加法器的电路功能以正确进行 1 6位数的加法吗?当然可以。需要做的就是
保存低字节数相加结果的进位,然后把该进位作为高字节数相加的进位输入。如何存储
1位
呢?当然是用1位锁存器。这时,该锁存器称为进位锁存器。
为了使用进位锁存器,需要有另一个操作码,称作“进位加”(Add with Carry)。在进行
8位数加法运算时,使用的是常规“加法”指令。加法器的进位输入为 0,加法器的进位输出
锁存在进位锁存器中(尽管根本不必用到)。
在进行 1 6位数加法运算时,仍然使用常规“加法”指令来进行低字节加法运算。加法器
的进位输入为 0,其进位输出锁存到进位锁存器中。要进行高字节加法运算就要使用新的“进
位加”指令。这时,两个数相加使用进位锁存器的输出作为加法器的进位输入。如果低字节
加法有进位,则其进位可用在第二次运算中;如果无进位,则进位锁存器的输出为 0。
如果进行1 6位数减法运算,还需要一个新指令,称为“借位减”(Subtract with Borrow)。
通常,减法操作需要使减数取反且把加法器的进位输入置为 1。因为进位通常不是 1,所以往
往被忽略。在进行 1 6位数减法运算时,进位输出应保存在进位锁存器中。高字节相减时,进
位锁存器的结果应作为加法器的进位输入。
加上新的“进位加”和“借位减”操作,共有 7个操作码:
操作码
L o a d
S t o r e
A d d
S u b t r a c t
Add with Carry(进位加)
Subtract with Borrow(借位减)
H a l t
代码
1 0 h
11 h
2 0 h
2 1 h
2 2 h
2 3 h
F F h
在减法和借位减法运算中,需要把送往加法器的数取反。加法器的进位输出作为进位锁
存器的输入。无论何时执行加法、减法、进位加法和借位减法操作,进位锁存器都被同步。
当进行减法操作,或进位锁存器的数据输出为 1并且执行进位加法或者借位减法指令时, 8位
加法器的进位输入被置为 1。
记住,只有上一次的加法或者进位加法指令产生进位输出时,进位加法操作才会使 8位加第17章 自 动 操 作
下载
159
法器的进位输入为 1。任何时候进行多字节数加法运算时,不管是否必要,都应该用进位加法
指令计算。为正确编码前面列出的 1 6位加法,可用如下所示方法:
“代码”
“数据”
低字节结果
高字节结果
不管是什么样的数,该方法都能正确工作。
有了这两个新的操作码,极大地扩展了机器处理的范围,使其不再只局限于进行 8位数加
法。重复使用进位加法指令,能进行 1 6位数、2 4位数、 3 2位数、 4 0位数等更多位数的加法运
算。假设要把 3 2位数7 A 8 9 2 B C D h与6 5 A 8 7 2 F F h相加,则需要一个加法指令及三个进位加法指
令:
“代码”
数据
低字节结果
次高字节结果
次高字节结果
最高字节结果
当然,把这些数存放到存储器中并非真的很好。这不仅要用开关来表示二进制数,而且
数在存储器中的地址也并不连续。例如, 7 A 8 9 2 B C D h从最低有效字节开始,每个字节分别存
入存储器地址 0 0 0 0 h、0 0 0 3 h、0 0 0 6 h及0 0 0 9 h中。为了得到最终结果,还必须检查地址 0 0 0 2 h、
0 0 0 5 h、0 0 0 8 h及0 0 0 B h中的数。
此外,当前设计的自动加法器不允许在随后的计算中重复利用计算结果。假设要把 3个8
位数加起来,然后再在和中减去一个 8位数,并且存储结果。这需要一次装载操作、两次加法
操作、一次减法和一次保存操作。但如果想从原先的和中减去另外一个数会怎么样呢?那个
和是不能访问的,每次用到它时都要重新计算。
原因在于我们已经建造了一个自动加法器,其中的代码 R A M和数据 R A M阵列同时、顺
序地从0 0 0 0 h开始寻址。代码 R A M中的每条指令对应于数据 R A M中相同地址的存储单元。一160
编码的奥秘
下载
旦“保存”指令使某个数据保存在数据 R A M中,这个数就不能再被装载到累加器中。
为了解决这个问题,要对自动加法器做一个基本的及大的改变。虽说刚开始看上去会异
常复杂,但很快你就会看到一扇通向灵活性的大门打开了。
让我们开始吧,目前我们已经有了 7个操作码:
操作码
代码
L o a d
S t o r e
A d d
S u b t r a c t
Add with Carry
Subtract with Borrow
H a l t
1 0 h
11 h
2 0 h
2 1 h
2 2 h
2 3 h
F F h
每个操作码在存储器中占 1个字节。除了“停止”代码外,现在希望每条指令在存储器中
占3个字节,其中第一个字节为代码本身,后两个字节存放一个 1 6位的存储器单元地址。对于
装载指令来说,其地址指明数据在数据 R A M阵列中的存储单元,该存储单元存放要装载到累
加器中的字节;对于加法、减法、进位加法和借位减法指令来说,地址指明要从累加器中加
上或者减去的字节的存储单元;对于保存指令来说,地址指明累加器中的内容将要保存的存
储单元。
例如,当前自动加法器所能做的最简单的工作就是加两个数。要完成这项工作,可以按
照下面的方法来设置代码 R A M阵列 和数据 R A M阵列:
“代码”
“数据”
结果
在改进的自动加法器中,每条指令(除了“停止”)需要3个字节:
“代码”
把地址0000h处的字节装入累加器
把地址0001h处的字节加到累加器
把累加器的内容存入地址0002h处
停止
每条指令(除了“停止”)后跟2个字节,用来表示在数据 R A M阵列中的 1 6位地址。这三
个地址碰巧为0 0 0 0 h、0 0 0 1 h和0 0 0 2 h,它们可以是任何其他地址。
前面说明了如何使用加法和进位加法指令来相加一对 1 6位数 — 比如7 6 A B h和2 3 2 C h。必
须把2个数的低字节保存在存储器单元 0 0 0 0 h和0 0 0 1 h中,把2个高字节保存在 0 0 0 3 h和0 0 0 4 h中,第17章 自 动 操 作
下载
161
其相加结果保存在 0 0 0 2 h和0 0 0 5 h中。
这样,我们可以用更合理的方式来保存两个加数及其结果,这可能会保存在以前从未用
过的存储区域:
“数据”
结果的高字节放在这里
结果的低字节放在这里
这6个存储单元不必像图中这样连在一起,它们可分散在整个 64KB 数据 R A M阵列中的任
何地方。为了把这些地址中的数相加,必须在代码 R A M阵列中按如下所示设置指令:
“代码”
“代码”
把地址4001h处的 把地址4000h处的字节装入
字节装入累加器 累加器
把地址4003h处的 把4002h处的字节同进位加到累
字节加到累加器 加器
把累加器中的
内容存入地址
4005h处 把累加器中的内容存入地址
4004h处
停止
可以看到保存在地址 4 0 0 1 h和4 0 0 3 h中的两个低字节首先相加,并把结果保存在地址 4 0 0 5 h
中。两个高字节(在地址 4 0 0 0 h和4 0 0 2 h中)利用进位加法进行相加,其结果保存在地址 4 0 0 4 h
中。如果去掉“停止”指令并向代码 R A M中加入更多指令,随后的计算就可以简单地通过存
储器地址来利用原先的数及它们的和。
实现这种设计的关键就是把代码 R A M阵列中的数据输出到3个8位锁存器中,每个锁存器保
存3字节指令的一个字节。第一个锁存器保存指令代码,第二个锁存器保存地址的高字节,第三
个锁存器保存地址的低字节。第二和第三个锁存器的输出组成了数据RAM 阵列的1 6位地址:
8位
锁存

控制面板
16位
计数

8位
锁存

8位
锁存

控制面板
数据162
编码的奥秘
下载
从存储器中取出指令的过程叫作取指令。在上述加法机中,每个指令长 3个字节。因每次
只能从存储器中取出一个字节,因此每次取指令需要 3个时钟周期。此外,一个完整的指令周
期需要四个时钟周期。所有这些变化使得控制信号变得更为复杂。
机器响应指令代码执行一系列操作称为执行指令,但这并不是说机器是有生命的东西,
它也不是通过分析机器码来决定做什么。每一个机器码用唯一的方式触发各种控制信号,使
机器产生各种操作。
注意,为了使上述加法机更为有用,我们已经放慢了它的速度。利用同样的振荡器,它
进行数字加法运算的速度只是本章列出的第一个自动加法器的
1 / 4 。这符合一个叫作
TA N S TA A F L的工程原理, TA N S TA A F L的意思是“世界上没有免费的午餐”。通常,机器在
某一方面好一点儿,在另一些方面必然会差一些。
如果不用继电器来建造这样一个机器,电路的大部分显然只是两个 64KB RAM阵列。确
实,早就该省去这些组件,并且一开始就决定只用 1 K B的存储器。如果能保证存储的所有东
西都在地址 0 0 0 0 h~0 3 F F h之间,那么用少于 6 4 k B的存储器也能很好地解决问题。
然而,你可能也不会太在意用到了两个 R A M阵列。事实上,也确实不用。前面介绍过的
两个R A M阵列 — 一个存储代码,一个存储数据 — 使得自动加法器的体系结构变得尽可能
清晰、简单。但既然已经决定每条指令占 3个字节 — 用第二和第三个字节来表示数据的存储
地址 — 就不再需要有两个独立的 R A M阵列,代码和数据可存储在同一个 R A M阵列中。
为了实现这个目标,需要一个 2 - 1选择器来确定如何寻址 R A M阵列。通常,像前面一样,
其地址来自 1 6位计数器。 R A M数据输出仍然连接到用来锁存指令代码及其 2字节地址的三个
锁存器上,但它们的 1 6位地址是 2 - 1选择器的第二个输入。在地址被锁存后,选择器允许被锁
存的地址作为R A M阵列的地址输入:
数据
8位锁存

控制面板
16位计
数器
2-1选 8位锁存
择器 器
8位锁存




1<词>,2[句],3/段\,4{节},5(章)。
2016-2-9 09:36
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zzz19760225
超级版主




积分 3673
发帖 2020
注册 2016-2-1
状态 离线
『第 29 楼』:  

代码第17章 自 动 操 作
下载
163
我们已经取得了很大的进步。现在把指令和数据输入到一个 R A M阵列中已成为可能。例
如,下图显示出怎样把两个 8位数相加再减去第三个数:
把地址0010h处的字节装入累加器
把地址0011h处的字节加到累加器
从累加器减去地址0012h处的字节
把累加器中的内容存入地址0013h处
停止
最后结果放在这里
通常,指令开始于0 0 0 0 h,这是因为复位后计数器从0 0 0 0 h处开始访问R A M阵列。最后的停
止指令存储在地址0 0 0 C h处。可以把这3个数及其运算结果保存在R A M阵列中的任何位置(除了
开始的1 3个字节,因为这些存储单元已经被指令占用)
,因而我们选择从0 0 1 0 h处开始存储数据。
现在假设你需要再加两个数到结果中,你可以输入一些新的指令来替换你刚输入的所有
指令,不过可能你并不想这样做。你也许更愿意在那些已有的指令末尾接着新的指令,但首
先得用一个新的装载指令来替换地址 000Ch 中的停止指令。此外,还需要两个新的加法指令、
一个保存指令和一个新的停止指令。唯一的问题在于有一些数据保存在地址 0010h 中,必须
把这些数据移到更高的存储地址中,并且修改那些涉及到这些存储器地址的指令。
想一想,把代码和数据混放在一个 R A M阵列中也许并不是一个迫切的问题,但可以肯定,
这样的问题迟早会到来,因此必须解决它。在这种情况下,可能你更愿意做的就是从地址
0 0 2 0 h处开始输入新指令,从地址 0 0 3 0 h处开始输入新数据:
把地址0013h处的字节装入累加器
把地址0030h处的字节加到累加器
把地址0031h处的字节加到累加器
把累加器中的内容存入地址0032h处
停止
最后结果放在这里164
编码的奥秘
下载
注意第一条装载指令指向存储单元 0 0 1 3 h,即第一次运算结果存储的位置。
因此现在有开始于0 0 0 0 h的一些指令、开始于0 0 1 0 h的一些数据、开始于0 0 2 0 h的另外一些指
令以及开始于0 0 3 0 h的另外一些数据。我们想让自动加法器从0 0 0 0 h处开始并执行所有的指令。
我们必须从 0 0 0 C h处去掉停止指令,并用其他一些东西来替换它,但这样就足够了吗?问
题在于无论用什么来替换停止指令都会被解释为一个指令字节,并且至此后存储器中每隔 3个
字节 — 在0 0 0 F h、0 0 1 2 h、0 0 1 5 h、0 0 1 8 h、0 0 1 B h和0 0 1 E h处,字节也会被解释为一个指令字
节。如果其中一个正好是 11 h会怎样呢?这是一个保存指令。如果保存指令后的两个字节刚好
指向地址 0 0 2 3 h又会怎样呢?机器会把累加器的内容写入该地址中,但是该地址中已经包含有
一些重要的东西。即使没有诸如此类的事情发生,加法器从存储器地址 0 0 1 E h的下一个地址中
取得的指令字节将在地址 0 0 2 1 h中,而不是0 0 2 0 h中,而0 0 2 0 h却正好是下一个指令的真实所在。
我们是否都同意不把停止指令从 0 0 0 C h处移走,而期待最佳方案呢?
不过,我们可用一个叫作 J u m p(转移)的新指令替换它。现在把它加入到指令表中。
操作码
代码
L o a d
S t o r e
A d d
S u b t r a c t
Add with Carry
Subtract with Borrow
Jump (转移)
H a l t
1 0 h
11 h
2 0 h
2 1 h
2 2 h
2 3 h
3 0 h
F F h
通常,自动加法器顺序寻址 R A M阵列。转移指令改变其寻址模式,而从 R A M阵列的某个
特定地址开始寻址。这样的命令有时也叫分支( b r a n c h)指令或者g o t o指令,即“转到另外一
个地方”的意思。
在前面的例子中,可用转移指令来替换 0 0 0 C h中的停止指令:
转移到地址0020h处的指令
30h 就是转移指令的代码,其下的 1 6位地址表示自动加法器要读的下条指令的地址。
因此,在前面的例子中,自动加法器仍从地址 0 0 0 0 h处开始,执行一条装载、一条加法、
一条减法和一条保存指令,然后执行转移指令,接着继续从 0 0 2 0 h处执行一条装载、两条加法
和一条保存指令,最后执行停止指令。
转移指令影响 1 6位计数器。当自动加法器遇到转移指令时,计数器被强制输入紧随转移
指令代码的新地址,这可以通过组成 1 6位计数器的边沿触发的 D型触发器的预置( P r e)和清
零( C l r )输入来实现:165第17章 自 动 操 作
下载
前面曾讲过,正常操作下,预置和清零输入都应该为 0。但如果 Pre = 1 ,则Q = 1 ;如果
Clr = 1,则Q = 0 。
如果想装载一个新值(称作 A,代表地址)到单个触发器中,可这样连线:
置位
复位
通常,置位信号为 0。这时,触发器的预置端为 0。除非复位信号为 1,否则清零端也为 0。
这样触发器可以不通过置位信号就可以清零。当置位信号为 1时,若A = 1 ,则Pre = 1且Clr =
0;若A = 0,则Pre = 0且Clr = 1。这意味着 Q端的值设置为A端的值。
1 6位计数器的每一位都需要一个这样的触发器。一旦装载一个特定的值,计数器将从那
个值开始继续计数。
然而,这些变化并不大。从 R A M阵列中锁存的1 6位地址既可作为 2 - 1选择器(它允许该地
址作为R A M阵列的地址输入)的输入也可作为 1 6位计数器的输入并由置位信号设置:
“数据”
8位
锁存

“代码”
置位
控制面板
复位
16位计
数器
2-1选
择器
8位
锁存

8位
锁存

显而易见,只有当指令代码为 3 0 h且其后面的地址被锁存,我们才必须保证置位信号为 1。166
编码的奥秘
下载
转移指令当然很有用,但它并非和一条只有时跳转而并非时刻跳转的指令一样有用,这样
的一个指令叫作条件转移。为了显示该命令如何有用,可提出这样一个问题:怎样才能让自
动加法器完成两个 8位数的相乘?例如,怎样才能得到像 A 7 h乘以1 C h这样简单运算的结果?
很容易,不是吗?两个 8位数相乘的结果是一个 1 6位数。为了方便起见,乘法中的 3个数
都用1 6位数来表示。首要的工作是决定把乘数和乘积放在何处:
16位的乘数
16位的被乘数
16位的结果从这里开始存放
每个人都知道A 7 h和1 C h(即十进制的2 8)相乘的结果与 A 7 h相加2 8次的结果相同。因此,
在1 0 0 4 h和1 0 0 5 h处的1 6位数就是累加结果。下图显示的是把 A 7 h加一次到那个位置的代码:
把地址1005h处的字
节装入累加器
把地址1004h处的字
节装入累加器
把地址1001h处的字 把1000h处的字节同进位
节加到累加器 加到累加器
把累加器的内容存到
地址1005h处 把累加器的内容存入
地址1004h处
在这6条指令执行完后,存储单元 1 0 0 4 h和1 0 0 5 h处的1 6位数等于A 7 h乘以1。因此,为了使
这1 6位数等于A 7 h乘以1 C h,这6个指令必须重复执行 2 7次。可以通过在地址 0012h 处接着输入
2 7次这6个指令来实现;也可以在 0 0 1 2 h处输入停止指令,然后按 2 8次复位键来得到最终结果。
当然,这两个方案都不理想。它们需要你做某些事情 (输入大批指令或者按复位键 )的次数
和乘数相当。当然你不愿意这样去进行 1 6位数的乘法运算。
但是如果在0012h 处输入转移指令会怎么样呢?这个指令使计数器从 0 0 0 0 h重新开始计数:
转移到地址0000h处的指令
这当然是一个技巧。第一次执行指令后,存储单元 1 0 0 4 h和1 0 0 5 h处的1 6位数等于A 7 h乘1,
然后转移指令使其返回到存储器顶部。第二次执行指令后,此 1 6位数等于 A 7 h乘2。终于,其第17章 自 动 操 作
下载
167
结果将等于 A 7 h乘1 C h。不过这样的过程并不会停止,它将不断地运行、运行、运行。
我们想让转移指令做的是使循环过程只重复所需的次数,这就是条件转移,它实施起来
并不困难。我们要做的第一件事情就是增加一个与进位锁存器类似的 1位锁存器。因为只有 8
位加法器的输出全为 0时它才锁存 1,所以叫它零锁存器:
8位加法器
零标志位
只有当或非门的 8个输入全为 0时,其输出才为 1。同进位锁存器的时钟输入一样,只有当
加法、减法、进位加法或借位减法指令运行时,零锁存器的时钟输入才锁存一个数,这个被
锁存的数值叫作零标志位。注意它,是因为它似乎行为相反:如果加法器输出全为 0,则零标
志位为1;若加法器输出不全为 0,则零标志位为 0。
利用进位锁存器和零锁存器,可以在指令表中再添加四条指令:
操作码
L o a d
S t o r e
A d d
S u b t r a c t
Add with Carry
Subtract with Borrow
J u m p
Jump If Zero (零转移)
Jump If Carry (进位转移)
Jump If Not Zero (非零转移)
Jump If Not Carry (无进位转移 )
H a l t
代码
1 0 h
11 h
2 0 h
2 1 h
2 2 h
2 3 h
3 0 h
3 1 h
3 2 h
3 3 h
3 4 h
F F h
例如,只有当零锁存器输出为 0时,非零转移指令才转移到指定地址。换句话说,如果上
一次加法、减法、进位加法和进位减法指令计算结果为 0,则没有转移发生。实现这个设计只
需在实现常规转移命令的控制信号上再加上一个控制信号:如果为非零转移指令,则只有当
零标志位为 0时,1 6位计数器的置位信号才被触发。
利用上述代码实现两个数的乘法所需的操作可由如下开始于地址 0 0 1 2 h处的指令完成:
把地址1003h处的字节装入累加器
把地址001Eh处的字节加到累加器
把累加器的内容存到地址1003h处
若零标志位不为0,转移到地址0000h处
停止168
编码的奥秘
下载
正如我们所设计的,循环一次后,位于 1 0 0 4 h和1 0 0 5 h处的1 6位数等于 A 7 h乘以1。上图中
的这些指令把字节从 1 0 0 3 h处装载到加法器中,此字节为 1 C h。再把这个字节与 0 0 1 E h处的数
据相加,此处数据正好是停止指令,但当然也是有效数字。把 F F h同1 C h相加与从 1 C h减去1的
结果相同,都等于 1 B h。这个值不为 0,所以零标志位为 0,字节 1 B h存回到地址 1 0 0 3 h处。接
下来是一条非零转移指令,零标志位没有置为 1,所以转移发生。下一条指令位于地址 0 0 0 0 h
处。
记住,存储指令不会影响零标志位。零标志位只能被加法、减法、进位加法、借位减法
指令所影响,因此它同这些指令中最近一个执行时所设置的值相同。
循环两次后,位于 1 0 0 4 h和1 0 0 5 h处的1 6位数将等于A 7 h乘以2。而1 B h加上 F F h等于1 A h,
不是0,因此又返回到存储器顶部。
循环到第 2 8次时,位于1004h 和1 0 0 5 h处的1 6位数等于 A 7 h乘以1 C h。位于1 0 0 3 h处的值等
于1,它将加上 F F h结果等于 0,因此零标志位被置位。非零转移指令不再转移到存储器地址
0 0 0 0 h处,相反,下一条指令为停止指令。至此,我们完成了全部工作。
现在可以肯定,很长一段时间以来我们已经装配了一组硬件,同时可以把它叫作计算机。
当然,它只是一台原始的计算机,但它毕竟是一台计算机。它与我们以前设计的计算器的不
同之处在于条件转移指令,控制重复或循环是计算机和计算器的区别。这里已经演示了条件
转移指令是如何使得这台机器进行两个数的乘法运算的。用类似的方法,它也能计算两个数
的除法。而且,还不局限于 8位数。它能加、减、乘、除 1 6位、2 4位、3 2位甚至更多位的数,
而且如果它能实现这些操作,也就能计算平方根,对数和三角函数。
既然已装配了一台计算机,就可以开始使用一些计算机方面的词汇。
我们装配的计算机归类为数字计算机,因为它采用的是离散值。曾经有过模拟计算机,
但它们正逐渐消失。(数字数据是离散数据,是具体的确定的值;而模拟信息是连续的、在整
个范围内变化的值。)
数字计算机有 4个主要部分:处理器、存储器、至少一个输入设备和一个输出设备。上述
机器中,存储器是一个 6 4 K B的 R A M阵列。输入和输出设备分别是 R A M阵列控制面板上的几
行开关和灯泡。这些开关和灯泡使人们可以输入数据到存储器并检查结果。
处理器是计算机中除存储器、输入 /输出设备以外的一切东西。处理器也叫中央处理器单
元或C P U。再通俗一点儿,处理器有时也称作计算机的大脑。但尽量避免用这样的术语,这
是因为在本章中我们所设计的东西根本不像大脑。(今天,微处理器这个词用得非常普及。微
处理器只是一个很小的处理器,通过采用第 1 8章将要讲到的技术而实现。但此刻我们用继电
器所建造的东西则很难用 “微”来定义。)
我们所建造的处理器是一个 8位处理器。累加器宽度为 8位,并且许多数据通路的宽度都
是8位,只有 R A M阵列的地址的数据通路是 1 6位的。如果用 8位的地址通路,则存储器容量只
能限于2 5 6字节而非65 536字节,那样处理器则有太大的局限性。
处理器有一些组件。已经确定的一个是累加器,它是一个简单的锁存器,用来在处理器内
部保存数据。我们所设计的计算机中, 8位反向器和 8位加法器一起称作算术逻辑单元或 A L U。
A L U只能进行算术运算,主要是加法和减法。在稍微复杂一点儿的计算机中(我们将会看到),
A L U也可进行逻辑运算,如“与”、“或”、“异或”。1 6位计数器叫作程序计数器 P C。
我们的计算机是用继电器、电线、开关和灯泡建造的,所有这些都是硬件。与之对应,第17章 自 动 操 作
下载
169
指令和输入存储器中的其他数据叫作软件,之所以叫“软件”是因为它们比硬件更容易改变。
当谈论计算机时,“软件”和“计算机程序”,更简单地讲“程序”是同义的,编写软件
也称作计算机程序设计。当采用一系列计算机指令使计算机进行两个数的乘法时,我们所做
的工作就是计算机程序设计。
通常,在计算机程序中,可以区分代码(即指令)和供代码使用的数据。有时这种区分
并不明显,如停止指令还可作为数- 1执行双重功能。
计算机程序设计有时也叫编写代码或编码。有时计算机程序员也叫编码员,尽管一些人
可能认为这是一个贬义的名词。程序员更愿意被称作“软件工程师”。
处理器可以响应的操作码(如指装载和存储的 1 0 h和11 h)叫作机器码,或机器语言。之
所以用“语言”这个术语是因为机器码类似于可读 /写的人类语言可被机器理解和响应。
我们要用很长的短语表示机器所执行的指令,如:进位加法( Add with Carry )。通常,
机器码都分配指定了用大写字母表示的短的助记符,这些助记符有 2或3个字符。下面是一系
列可能的上述计算机所能识别的机器码的助记符:
操作码
装载(L o a d)
保存(S t o r e)
加(A d d)
减(S u b t r a c t)
进位加(Add with Carry)
借位减(Subtract with Borrow)
转移(J u m p)
零转移(Jump If Zero)
进位转移( Jump If Carry)
非零转移( Jump If Not Zero)
无进位转移( Jump If Not Carry)
停止(H a l t)
代码 助记符
1 0 h
11 h
2 0 h
2 1 h
2 2 h
2 3 h
3 0 h
3 1 h
3 2 h
3 3 h
3 4 h
F F h L O D
S TO
A D D
S U B
A D C
S B B
J M P
J Z
J C
J N Z
J N C
H LT
这些助记符特别适于和另外一对简洁短语结合使用。例如,不说像“把 1 0 0 3 h处的值装载
到累加器中”这样罗嗦的话,而是用下面语句来代替:
LOD
A,[1003h]
位于助记符 L O D右边的A和[ 1 0 0 3 ]叫作操作数,它们是特定的装载( L o a d)指令的操作对
象。左边的操作数为目的操作数( A代表累加器),右边的为源操作数,方括号表示要装载到
累加器中的值不是 1 0 0 3 h,而是存储在存储器地址 1 0 0 3 h中的值。
同样,指令“把 0 0 1 E h处的字节加到累加器中”可简写为:
ADD
A,[001Eh]
而“把累加器中的内容保存到地址 1 0 0 3 h处”记作:
STO
[1003h],A
注意,目的操作数(存储指令的存储单元)仍然在左边,源操作数在右边。累加器的内
容存储在地址1 0 0 3 h处。指令“若零标志位不为 1则转移到0 0 0 0 h处”可简洁地记作:
JNZ 0000h
该指令中没有使用方括号,这是因为该指令是转移到地址
0 0 0 0 h处而不是转移到地址170
编码的奥秘
下载
0 0 0 0 h中保存的值所表示的位置处。
用缩写指令的形式来表示很方便,因为指令能以可读的方式连续列出来而不需画出存储
器的分配图。为了表示某一指令存储在某一地址,可以用一个十六进制地址后加冒号来表示,
如下所示:
0000h:LOD A,[1005h]
下面表示了一些存储在某一地址的数据:
1000h:00h,A7h
1002h:00h,1Ch
1004h:00h, 00h
用逗号隔开的两个字节表示第一个字节保存在左边的地址中,第二个字节保存在紧接着
该地址的下一个地址中。上述三行相当于:
1000h:00h,A7h,00h,1Ch,00h,00h
因此,整个乘法程序可写成如下一系列语句:
0000h:
LOD A,[1005h]
ADD A,[1001h]
STO [1005h],A
LOD A,[1004h]
ADC A,[1000h]
STO [1004h],A
LOD A,[1003h]
ADD A,[001Eh]
STO [1003h],A
JNZ 0000h
001Eh: HLT
1000h: 00h,A7h
1002h: 00h,1Ch
1004h: 00h,00h
使用空格和空行只是为了使程序具有更好的可读性,以方便人们阅读程序。
写代码时最好不要用真实的数字地址,因为它们是会变的。例如,如果要把数字存储到
地址2 0 0 0 h~2 0 0 5 h处,需要重写许多语句。较好的方法是使用标号来指定存储单元,这些标
号是简单的单词,或类似于单词的东西,如:
BEGIN:
LOD A,[RESULT+1]
ADD A,[NUM1+1]
STO [RESULT+1],A
LOD A,[RESULT]
ADC A,[NUM1]
STO [RESULT],A
LOD A,[NUM2+1]
ADD A,[NEG1]第17章 自 动 操 作
下载
171
STO [NUM2+1],A
JNZ BEGIN
NEG1:
HLT
NUM1: 00h,A7h
NUM2: 00h,1Ch
RESULT:00h,00h
注意,标号 N U M 1、N U M 2和R E S U LT都表示保存两个字节的存储单元。在这些语句中,
标号 N U M 1 + 1 、N U M 2 + 1 和R E S U LT + 1 都指向特定标号后的第二个字节。注意,
N E G 1
(negative one)用来标记H LT指令。
此外,为了不忘记这些语句的意思,可以加上一些注释,它们与语句之间用分号隔开:
BEGIN:
LOD A,[RESULT+1]
ADD A,[NUM1+1]
;Add low-order byte(加低字节)
STO [RESULT+1],A
LOD A,[RESULT]
ADC A,[NUM1]
;Add high-order byte(加高字节)
STO [RESULT],A
LOD A,[NUM2+1]
ADD A,[NEG1]
;Decrement second number(第二个数减1)
STO [NUM2+1],A
JNZ BEGIN
NEG1: HLT
NUM1: 00h,A7h
NUM2: 00h,1Ch
RESULT: 00h,00h
以上表示的是一种计算机程序设计语言,称作汇编语言。它是全数字的机器代码和指令
描述性语言的综合,且存储器地址用符号表示。人们有时会把机器语言和汇编语言弄混淆,
因为它们是表示同种事情的两种不同的方法。汇编语言的每条语句都对应于机器代码的特定
字节。
如果你想为本章所创建的计算机编写程序,你可能首先想用汇编语言写出来(在纸上)。
然后,在认为它正确并准备测试它时,可以对它进行手工汇编:这意味着用手工的方法把每
一个汇编语句转换成机器代码,仍然写在纸上。接着,你可以用开关把机器码输入到 R A M阵
列并运行该程序,即让机器执行指令。
学习计算机程序设计的概念时,不可能很快就能正确知道程序的毛病所在。编写代码时
— 特别是用机器代码 — 很容易产生错误。输入一个错误的数字已经很不好了,但如果输入
一条错误的指令会怎么样呢?本想输入 1 0 h (装载指令 ),但却输入了 11 h(保存指令),不但机
器不会把期望的数据装载,而且该处的数据还会被累加器中的内容覆盖。
一些错误可以导致难以预料的结果。假设使用无条件转移指令转移到没有有效指令代码
的位置,或者偶然使用存储指令覆盖了一些指令,任何事情都可能发生(经常如此)。
上述乘法程序中也有一些毛病。如果你执行它两次,则第二次将会是 A 7 h乘以2 5 6,并且
结果将加到原来计算的结果中。这是因为程序执行一次后,地址 1 0 0 3 h处的值为 0。当程序第
二次执行时,F F h将加到那个值中,其结果不为 0,程序将继续执行直到它为 0。172
编码的奥秘
下载
我们已看到上述机器可以进行乘法运算,同样,它也可以进行除法运算。此外,它可利
用这些基本功能进行平方根、对数和三角函数的计算。机器所需要的只是用来进行加法、减
法的硬件及利用条件转移指令来执行适当代码的一些方法。正如一个程序员所说:“我可以用
软件完成其余功能”
当然,软件可能相当复杂。许多书中都描述了一些算法供程序员解决专门的问题,本书
还没准备这样做。我们一直在考虑自然数而没有考虑如何在计算机中表示十进制小数,我们
将在第2 3章介绍它。
前面已说过几次,建造这些设备的所有硬件在 1 0 0多年前就有了。但本章中出现的计算机
在那时却没有建造出来。在 2 0世纪3 0年代中期,最早的继电器计算机制造出来时,包含在设
计中的许多概念还未形成,直到 1 9 4 5年左右人们才开始意识到。例如,直到那时候,人们仍
然设法在计算机内部使用十进制数而不是二进制数;计算机程序也并非总是存储在存储器中,
而是有时把它存在纸带上。特别是早期计算机的存储器非常昂贵且体积庞大。不管是在 1 0 0年
前还是在现在,用 5 0 0万个电报继电器来建造 6 4 K B的R A M阵列都是荒唐的。
当我们展望和回顾计算器和计算装置的历史时,可能会发现根本没必要建造这样精致的
继电器计算机。就像在第 1 2章提到的,继电器最终会被真空管和晶体管这样的电子设备所取
代。或许我们也会发现他人制造的相当于我们设计的处理器和存储器的东西能小到放在手掌
中。下载
第18章 从算盘到芯片
纵观历史,人类发明了很多灵巧的工具和机器以满足广泛的需求,从而使数学运算变得
更容易了些。虽然人类天生就有使用数字的能力,但仍能经常需要帮助。人们常遇到一些自
己不能轻易解决的问题。
数字可看成是早期帮助人类记录商品和财富的工具。许多文明,包括古希腊和美洲土著,
都借用石子或谷物来计数。在欧洲使用计数板,而在中国则对由框和珠子组成的算盘较为熟
悉:
没有人真的喜欢乘法和除法,但却有人为它做过什么,苏格兰数学家 Join Napier(1550-
1 6 1 7 )就是这少数人中的一个。他发明了对数来简化这些操作,两数之积简化为它们对数的和。
因此,如果你想使两数相乘,先在对数表中分别查出它们的值,然后相加,再用相反的方法查
对数表就可得到它们的积。
对数表的建立,使得随后 4 0 0年里一些最伟大的思想家一直为此忙碌,而另一些人却在设
计使用小装置来代替对数表。一种有对数标尺的滑尺已有很长的历史了,它由 Edmund Gunter
(1 5 8 1-1 6 2 6)发明并由 William Oughtred(1 5 7 4-1 6 6 0)修正。1 9 7 6年,当K e u ff e l & E s s e r公司
将其公司最后制造的滑尺捐赠给华盛顿特区的 Smithsonian 学院时,滑尺的历史也就宣告结束
了,其中的原因是手持计算器的出现。
N a p i e r也发明了一种乘法辅助器,它由刻在骨头、号角、像牙上的数字条组成,因而这样
的辅助器称为 N a p i e r骨架。1 6 2 0年左右,Wilhelm Schickard(1 5 9 2-1 6 3 5)制造出了最早的有
点儿自动功能的由 N a p i e r骨架组成的机械计算器。几乎在同时出现了由互相连结的轮子、齿
轮和水平仪组成的另外一种计算器,这种机械计算器的两个最主要的制造者是数学家和哲学
家布莱兹・帕斯卡 ( 1 6 2 3-1 6 6 2 )和莱布尼兹 ( 1 6 4 6-1 7 1 6 )。
你一定能记得最初的 8位加法器和能自动进行多于 8位数的加法计算的计算机中的进位是
多么令人讨厌。进位原先似乎只是加法运算中的一个小问题,但在加法机中却成了一个中心
问题。即使设计一个能进行除进位外的所有工作的加法机,也不能说工作就算完成了。
进位处理是否成功是评估老式计算机的关键。例如,帕斯卡设计的进位机制禁止减法运
算。为了进行减法,必须加上 9的补码,这在第 1 3章中已经讲到。直到 1 9世纪后期,才出现了
真正可以为人们所使用的机械计算器。174
编码的奥秘
下载
一个奇特的发明对计算的历史产生了深远的影响,就像它对纺织所产生的深远影响一样,
这就是约瑟夫・玛丽・杰奎德 ( 1 7 5 2-1 8 3 4 )所发明的自动织布机。杰奎德织布机(大约产生于
1 8 0 1年)使用上面已打孔的金属卡片(就像钢琴上的金属卡片)来控制编织物的图案。杰奎
德的一大杰作就是用黑白丝线织成的自画像,为此使用了大约 1万张卡片。
在1 8世纪(甚至直到 2 0世纪4 0年代),计算机就像一个以计算数字谋生的人。使用星星进
行航海导航经常需要对数表,并且三角函数表也是必需的。如果需要发布新表,则需要许多
计算机来工作,然后把结果汇总起来。当然,在这一过程的任何阶段,即从初始化计算到设
置类型来打印最后几页都可能会出现错误。
从数学表中消除错误的愿望激发了查尔斯・巴贝芝( 1 7 9 1—1 8 7 1)。巴贝芝是一位英国的
数学家和经济学家,他和摩尔斯差不多是同一时代的人。
在那时,数学表(以对数表为例)并不是通过计算表中每
一项确切的对数值而建立的,因为这得花费很多时间。取而代
之的是选择一些数进行对数计算,而介于这些数中间的那些数
则采用插补,即称作差分的方法,通过相对简单的计算来得到。
大约在 1 8 2 0年,巴贝芝认为可以设计并制造一台机器来自
动建立表,甚至可以到自动设置打印类型这一步,这样可以消
除错误。他构想了差分机,这是一个很大的机械加法机。通过
切换,可使位于 1 0个不同位置的轮子来表示各位数的十进制数
字,负数用 1 0的补码来计算。尽管一些早期的模型可以证明巴
贝芝的设计是可行的,并且也从英国政府获得了一些支持,但差分机却从未完成过。巴贝芝
于1 8 3 3年放弃了这一工作。
然而,就在那个时候,巴贝芝又有了一个更好的构想,这就是解析机 (重复的设计和再设
计不断耗费着巴贝芝的生命,直到他死去 ),解析机是 1 9世纪最接近计算机的发明。在巴贝芝
的设计中,有一个存储系统(类似于今天存储器的概念)和运算器(算术单元)。乘法由重复
加法来实现,除法由重复减法来实现。
解析机最精华的部分在于它可以用卡片来编程,这些卡片是由杰奎德的按图案编织的织
布机上的卡片经过改造而制成的。正如艾达・奥古斯塔,即拉弗雷斯女伯爵( 1 8 1 5-1 8 5 2)在
她翻译的由一个意大利数学家写的,关于巴贝芝解析机的文章的按语里写的:“我们可以说解
析机编织的是代数模型,正如杰奎德织布机编织的是花和叶一样”。
巴贝芝可能是第一个意识到计算机中条件转移的重要性的人。拉弗雷斯女伯爵关于此也
曾写道:“操作循环必须理解成一批操作,这些操作可以重复多次。无论是只重复两次还是无
穷次,都是一个循环,归根到底重复组成了循环的这些操作。许多情况下,还会出现一个或
多个循环的重复,即循环的循环或多个循环的循环”。
尽管差分机最终由 G e o rg和Edvard Scheutz 父子在1 8 5 3年制成,但巴贝芝的机器那时已被
遗忘了很久,直到 2 0世纪3 0年代人们开始追寻 2 0世纪计算机的根源时才再次想起。巴贝芝曾
经做的东西已经被后来的技术所超越,除了他对自动化的超前认识外,他并没有为 2 0世纪的
计算机工程留下什么东西。
计算机历史上另一个里程碑来源于美国宪法第二部分的第一篇。这一部分里除其他事情
外还要求每 1 0年进行一次人口普查。 1 8 8 0年人口普查的时候,人口信息按年龄、性别及祖籍下载
第18章 从算盘到芯片
175
来收集,数据的收集差不多花了七年的时间来进行。
由于担心 1 8 9 0年的人口普查可能需要超过 1 0年的时间,人口普查局寻求使该系统工作自
动化的可能性并选用了赫曼・霍勒瑞斯 ( 1 8 6 0—1 9 2 9 )开发的机器,此人是 1 8 8 0年人口普查的
统计员。
5
1
霍勒瑞斯的想法是采用马尼拉穿孔卡片,大小是 6 8 × 3 4 。
(虽然霍勒瑞斯不可能知道巴贝芝如何使用卡片在他的解析机上编
程,但他却很熟悉杰奎德织布机上卡片的使用。)卡片上的孔组成
2 4列,每列 1 2个,这样共有 2 8 8个位置,这些位置表示某个人在人
口普查记录中的某些特征。普查员通过在卡片的适当位置上打 1 / 4
英寸的方孔来标识这些特征。
本书可能使得人们习惯于用二进制码的概念来思考问题,因
此,你可能马上会想到卡片上的 2 8 8个穿孔点可以存储 2 8 8位信息。
但是,这些卡片并不是这样用的。
例如,在纯二进制系统中,人口普查卡片会有一个位置来表示性别,可以用打孔表示男
性,未打孔表示女性(或者相反)。但是,霍勒瑞斯的卡片用两个位置表示性别,一个位置打
孔表示男性,另一个位置打孔表示女性。同样,用两个穿孔表示年龄,一个穿孔指明一个 5年
的年龄范围: 0~4、5~9、1 0~1 4等等,另一个孔用 5个位置中的一个来表明在该范围内的确
切年龄。年龄编码需要卡片上总共 2 8个位置。而纯二进制系统只需要 7个位置就可编码 0~1 2 7
的任何年龄。
我们应该原谅霍勒瑞斯在记录人口普查信息时没有采用二进制系统,对于 1 8 9 0年的人口
普查员来说,把年龄转换成二进制数要求太高了一些。还有一个实际原因来解释穿孔卡片系
统为什么不能全部是二进制的是因为二进制系统可能出现这样一种情形,即所有的孔都被打
孔,使得卡片很脆弱,结构不牢固。
人口普查的数据收集可进行统计或制成表格。你可能想知道每一个区域内有多少人生活,
当然,你也可能对人口的年龄分布统计信息感兴趣。正因为如此,霍勒瑞斯制造了一个制表
机,它能结合手工操作和自动操作。操作员把一个有 2 8 8个弹簧针的板子压到每一个卡片上,
对应于卡片上每一个穿孔的针接触水银池形成电路,电路触发电磁铁使十进制计数器计数。
霍勒瑞斯在分类卡片的机器上也用了电磁铁。例如,如果需要统计所记录的每一个职业
的年龄资料,首先需要按职业对卡片分类,然后对每一个职业统计年龄资料。分类机与制表
机一样用手压,但分类机使用电磁铁打开一个开口,对应于 2 6个分隔区域中的一个,操作员
把卡片放入分隔区域,然后用手工关上开口。
这项实验在自动进行 1 8 9 0年的人口普查工作中取得了巨大成功,处理了超过 6 2 0 0万张的
卡片,包含的数据是 1 8 8 0年人口普查的 2倍,而数据处理只花了大约 1 8 8 0年人口普查所花时间
的1 / 3。霍勒瑞斯和他的发明享誉全球。 1 8 9 5年,他甚至到了莫斯科并成功地卖出了他的设备,
该设备在1 8 9 7年第一次用于俄罗斯的人口普查。
霍勒瑞斯开始进行各种活动。 1 8 9 6年,他创立了制表机公司,出租和出售穿孔卡片设备。
1 9 11年,经过合并,该公司成为计算-制表-记录 ( c c o m p u t i n g - Ta b u l a t i n g - R e c o r d i n g )公司,即
C - T- R公司。到 1 9 1 5年,C - T- R的主席是 Thomas J.Wa t s o n ( 1 8 7 4-1 9 5 6 ),他在1 9 2 4年把公司的
名字改为国际商用机器公司,即 I B M。176
编码的奥秘
下载
1 9 2 8年,原先的 1 8 9 0年的人口普查卡片已经演化成为著名的“不会卷曲、折叠’、翘页”
的I B M卡片,有 8 0列1 2行。它们用了 5 0多年,即使在最后几年也被称作霍勒瑞斯卡片。在第
2 0、2 1和2 4章将要讲到这些卡片的影响。
在把目光移到 2 0世纪之前,不要对 1 9世纪那个年代有太多的偏见。显然,本书主要着眼
于数字系统的发明,这些发明包括电报、布莱叶盲文、巴贝芝机器和霍勒瑞斯卡片。当与数
字概念和数字设备一起工作时,很容易会把整个世界都想像成数字世界。但是, 1 9世纪的特
征更多体现在那些不是数字的发明及发现上。的确,我们感受到的自然世界只有很小一部分
是数字的,它更接近于是连续的而不那么容易被量化。
尽管霍勒瑞斯在他的卡片制表机和卡片分类机上用了继电器,但是直到 2 0世纪3 0年代中
期,人们才真正开始用继电器来制造计算机 (后来叫机电式计算机 )。这些机器上用的继电器通
常不是电报继电器,而是那些用来在电话系统中控制呼叫路由的继电器。
早期的继电器计算机并不像我们在上一章中制造的继电器计算机(将会看到,后者计算
机的设计基础是基于从 2 0世纪7 0年代开始的微处理器)。特别地,今天对我们来说计算机内采
用二进制数是显然的,但那时并不是这样。
我们所设计的继电器计算机与早期的继电器计算机之间的另一个区别是在 2 0世纪3 0年代,
没有人会狂热到用继电器构造524 288位的存储器!所需的造价、空间及功耗使得这样大的存储
器不可能实现。可用的很小的存储器只是用来存储中间结果,而程序本身存储在像带有穿孔的
纸带这样的物理媒体上。的确,把代码和数据放入存储器的处理方式是一个很现代化的概念。
按年代排列,第一个继电器计算机似乎是由 Conrad Zuse(1 9 1 0-1 9 9 5)建造的。 1 9 3 5年
当他还是一个工程系的学生的时候,他就开始在他父母位于柏林的住所里制造计算机。他采
用的是二进制数,但却是早期版本,且用的是机械存储器而不是继电器。 Z u s e在老式的 3 5毫
米的电影胶片上穿孔来进行计算机编程。
1 9 3 7年,贝尔电话实验室的 G e o rge Stibitz(1 9 0 4-1 9 9 5)把一对电话继电器安装在家里,
并且又连接了一个 1位加法器到餐桌上,后来他的夫人称它为“K机器”
(K表示k i t c h e n,厨房)

该实验导致在1 9 3 9年产生了贝尔实验室的复数计算机。
与此同时,哈佛大学的研究生 Howard Aiken(1 9 0 0-1 9 7 3)因需要某种方法来做大量重
复计算,从而使得哈佛大学和 I B M合作,制造出了最终称为 Harvard Mark I 的自动顺序控制
计算机( A S C C:automated sequence controlled calculator),此项工作在 1 9 4 3年完成。这是
第一台打制表格的数字计算机,它终于实现了巴贝芝的梦想。 Mark II 是以巨大的继电器为基
础的机器,使用了 13 000个继电器。由 A i k e n领导的哈佛计算实验室讲授了计算机科学的第 1
课。
继电器并不是制造计算机的最好器件,因为它是机械的,工作时需弯曲一个金属簧片,
如果超负荷工作,簧片就会折断;如果有一小片污垢或纸片粘在触点之间,继电器就会失效。
一个著名的事件发生在 1 9 4 7年,从 Harvard Mark II 计算机的一个继电器中找到一只蛾子。
Grace Murry Hopper (1 9 0 6—1 9 9 2)1 9 4 4年加入A i k e n的小组,此人后来在计算机程序设计语
言领域非常有名。他在计算机日志中记录了这只蛾子,写道“第一次发现了真正的 b u g”。
继电器的一种可能的替代品是真空管,真空管由 John Ambrose Fleming (1 8 4 9—1 9 4 5)
和Lee de Forest (1 8 7 3—1 9 6 1)发明用来同无线电设备连接。到 2 0世纪4 0年代,真空管早已
用来放大电话信号。事实上,每一家的落地式收音机都装上了用来放大无线电信号的真空管,下载
第18章 从算盘到芯片
177
以便人们能听见。真空管可以连接成与、或、与非和非门,这一点非常像继电器。
逻辑门是由继电器还是由真空管来制造的并不重要。利用逻辑门可集成加法器、选择器、
译码器、触发器和计数器。前面几章讲的基于继电器的器件在当继电器被换成真空管时仍然
可用。
不过真空管也有问题,它们昂贵、耗电量大、散发的热量多。然而最大的问题在于它们
最终会被烧毁,这也就是它们的寿命问题。有真空管收音机的人就习惯于隔一段时间更换这
些管子。电话系统设计成有许多多余的管子,因此损失点儿管子也不是大的问题。(没有人能
指望电话系统不出一点儿问题。)然而计算机中的一个管子烧毁以后,并不能很快被检测到,
而且,计算机中使用了如此多的真空管,可能每几分钟就会烧毁一个。
使用真空管相对于继电器的最大好处在于它每百万分之一秒(即 1微秒)就可以跳变一次。
真空管改变状态(开关闭合或断开)的速度比继电器快 1 0 0 0倍,在最好的情况下,继电器状态
的变化大约需 1毫秒,即千分之一秒。有趣的是,在早期计算机的研究中,速度问题并不是最
重要的,这是因为早期计算机总的计算速度与机器从纸带或电影胶片中读取程序的速度密切相
关。正是因为计算机是基于这种方式制造的,真空管比继电器速度快多少也就无关紧要了。
在2 0世纪4 0年代初,真空管开始在新的计算机中替换继电器。直到 1 9 4 5年,晶体管制成。
正如继电器机器称为机电式计算机,真空管则是第一台电子计算机的基础。
在英国, C o l o s s u s计算机( 1 9 4 3年开始使用)用于破译德国的“ E n i g m a”代码生成器生
成的密码。为这个项目(和英国以后的一些计算机项目)做出贡献的人是艾伦・
M・图灵
( 1 9 1 2—1 9 5 4 ),他当时由于写了两篇很有影响的论文而闻名于世。第一篇论文发表于 1 9 3 7年,
其中首先提出了“计算能力”的概念,用以分析计算机可以做到和不能做到的事。他构思出
了现在称为图灵机的计算机抽象模型。图灵写的第二篇著名论文的主题是人工智能,他介绍
了一个测试机器智能的方法,现在称作图灵测试法。
在摩尔电气工程学校, J.Presper Eckert(1919-1 9 9 5 )和John Mauchly(1907—1 9 8 0 )设计了
E N I A C(electronic numerical integrator and computer,电子数字积分器和计算机)。它采用了
18 000个真空管,于 1 9 4 5年末完成。纯粹按吨位(大约 3 0吨)计算, E N I A C是曾经制造出来
的(也许以后也是)最大的计算机。到 1 9 7 7年,你可以在电器行买到更快的计算机。然而,
E c k e r t和M a u c h l y的专利却被 John V. A t a n a s o ff ( 1 9 0 3—1 9 9 5 )给阻挠了。 A t a n a n s o ff在早期曾设
计了一个电子计算机,但它从未很好地工作过。
E N I A C引起了数学家约翰・冯・诺依曼 ( 1 9 0 3—1 9 5 7 )的兴趣。从 1 9 3 0年开始,匈牙利出
生的冯・诺依曼就一直住在美国。他是一个令人瞩目的人物,
因能在脑子里构思复杂的算法而享有很高的声誉,他是普林斯
顿高级研究学院的一名数学教授,研究范围很广,从量子理论
到游戏理论的应用再到经济学。
冯 ・ 诺 依曼 帮 助 设 计了 E N I A C 的后 继产品 E D VA C
(electronic discrete variable automatic computer )。特别是在
1 9 4 6年与 Arthur W . B u r k s和Herman H.Goldstine 合写的论文
《Preliminary Discussion of the logical Design of an Electronic
Computing instrumert 》中,他描述了有关计算机的几点功能,
这些功能使得 E D VA C比E N I A C更先进。 E D VA C的设计者感觉178
编码的奥秘
下载
到在计算机内部应该使用二进制数,而 E N I A C用的是十进制数;计算机应该具有尽可能大的
存储器,当程序执行时,这个存储器可用来存储程序代码和数据;( E N I A C中的情况不是这
样,对E N I A C进行编程是通过断开开关和插上电缆来进行的。)指令应该在存储器中顺序存放
并用程序计数器来寻址,但也应该允许条件转移。这种设计思想叫作存储程序概念。
这种设计思想是重要的革命化的一步,今天称为冯・诺依曼体系结构,上一章建造的计
算机就是典型的冯・诺依曼机器。但冯・诺依曼体系结构也带来冯・诺依曼瓶颈,冯・诺依
曼型机器需要花费大量的时间从存储器中取出指令来准备执行。应该还记得第 1 7章最后设计
的计算机取指令的时间占整个指令周期的 3 / 4。
在E D VA C时代,用真空管构建存储器是不值得的,因而人们使用一些古怪的方法来解决
这个问题。一个成功的方法就是水银延迟线存储器,它使用 5英尺长的水银管子。在管子的一
端,每隔1微秒向水银发一个小脉冲。这些脉冲需要 1毫秒的时间到达管子的另一端(此时,它
们像声波一样会被检测到,然后送回到开始的地方),因此每个水银管可存储大约 1 0 2 4位信息。
直到2 0世纪5 0年代中期,磁芯存储器才开发出来。这种存储器由大量的环绕着电线的电
磁金属环组成,每个小环保存 1位信息。在磁芯存储器被其他技术取代后的相当一段时期内,
还经常听到老程序员把由处理器访问的存储器称作磁芯。
在2 0世纪4 0年代,冯・诺依曼并不是唯一一个对计算机的本质进行概念上思考的人。
克劳德・香农( 1 9 1 6年出生)是另外一个有着重大影响的思想家。第 11章曾经提到他1 9 3 8年
的硕士论文,论文中确立了开关、继电器和布尔代数之间的关系。 1 9 4 8年,当他在贝尔电话
实验室工作时,他在《 Bell System Technical Journal》上发表了一篇题为《 A Mathematical
Theory of Communication》的论文,其中不仅引入了“位”的概念,而且确立了一个现代称
为“信息理论”的研究领域。信息理论涉及在噪声(经常阻碍信息传送)存在的情况下传送
数字信息以及如何进行信息补偿等问题。 1 9 4 9年,他写了第 1篇关于编写让计算机下棋的程序
的文章; 1 9 5 2年他设计了通过继电器控制的机械老鼠,这个老鼠可以在迷宫中记住路径。香
农同时也因为他会骑独轮车,玩变戏法而在贝尔实验室很出名。
Norbert Wi e n e r ( 1 8 9 4-1 9 6 4 ) 1 8岁时就在哈佛大学取得了数学博士学位,因《 C y b e r n e t i c s ,
o r Control and Communication in the Animal and Macbine》(1 9 4 8)一书而闻名于世。他首次
使用控制论( C y b e r n e t i c s)这个词来表示一种把人及动物的生物活动与计算机及机器人的机
理联系起来的理论。在现代文化里,广泛使用 c y b e r-前缀表示与计算机相关的东西。更特别的
是,成千上万的计算机通过因特网进行的互连称作 c y b e r s p a c e(信息空间),这个词来自科幻
小说作家William Gibson 1984年的小说《 N e u r o m a n c e r》中的词c y b e r p u n k。
1 9 4 8年,E c k e r t - M a u c h l y计算机公司(Remington Rand公司的后继者)开始开发第一台商
用计算机 U N I VAC(universal automatic computer),并于1 9 5 1年完成。第一台被送往人口普查
局。U N I VA C的首次网络应用是用于 C B S,用来预测 1 9 5 2年的总统选举结果。 Walter Cronkite
称它为“电脑”。同样是在 1 9 5 2年,I B M发布了它的第一个商用计算机系统,即 7 0 1。
从此,开始了社团和政府使用计算机的漫长历史。然而,之所以对这段历史感兴趣可能
是因为我们要追踪另一段历史轨迹 — 即降低计算机造价和大小并且使它进入家庭的轨迹,
它开始于1 9 4 7年一场几乎不被人注意的电子技术突破。
贝尔电话实验室许多年里都是这样一个地方:聪明的人可以在此做他感兴趣的任何事。
所幸的是,他们之中有人对计算机感兴趣,如已经提到的 G e o rge Stibitz 和Claude Shannon,第18章 从算盘到芯片
下载
179
他们在贝尔实验室工作的时候都为早期的计算机作出了突出的贡献。后来,在 2 0世纪7 0年代,
贝尔实验室诞生了很有影响的操作系统 U N I X和程序设计语言 C语言,这些在随后的几章里将
要讲到。
1 9 2 5年1月1日,美国电话电报公司正式把它的科学和技术研究部分与商业部分分离,另
外建立附属机构,这样贝尔实验室诞生了。贝尔实验室的主要目的是为了研究能够提高电话
系统性能的技术。幸运的是,它的要求非常含糊,可以包含所有的事情。但在电话系统中,
一个明确的长期的目标是:在线路上传输的声音信号能不失真地放大。
从1 9 1 2年起,贝尔电话系统就采用了真空管放大器,大量的研究和工程人员着手提高电
话系统使用的真空管的性能。尽管这样,真空管仍然有许多问题。管子体积大,功耗大且最
终会烧毁。不过,在当时却是唯一的选择。
1 9 4 7年1 2月1 6日,当贝尔实验室的两个物理学家 John Bardeen(1908 —1 9 9 1 )和Wa l t e r
B r a t t a i n ( 1 9 0 2—1 9 8 7 )在装配一个不同类型的放大器时,所有的一切都改变了。这种新型放大
器由锗片 — 一种称作半导体的元素 — 和一条金箔构成。一个星期后,他们给他们的上司
William Shockley(1 9 1 0—1 9 8 9)进行了演示。这就是第一个晶体管,一种被人们称为 2 0世纪
最伟大的发明的器件。
晶体管不是凭空产生的。 8年前,即 1 9 3 9年1 2月2 9日,S h o c k l e y在笔记本写下:“今天我
想用半导体而不是真空管做放大器在原理上是可能的。”第一个晶体管被发明以后,随后许多
年它继续被完善。 1 9 5 6年,S h o c k l e y、B a r d e e n和B r a t t a i n获得诺贝尔物理学奖 — “因为他们
在半导体上的研究并且发明了晶体管。”
本书的前面谈到了导体和绝缘体。之所以称作导体是因为它们非常容易导电,铜、银和
金都是很好的导体。并非巧合,所有这三种元素都在元素周期表的同一列。
前面讲过,原子中的电子分布围绕在原子核的外层。上述三种导体的特征是只有一个单
独的电子在最外层。这个电子很容易与原子的其余部分分离并自由移动形成电流。与导体相
对的是绝缘体,像橡皮和塑料,它们几乎不能导电。
锗和硅元素(还有一些化合物)称为半导体,并不是因为它们的导电性是导体的一半,
而是因为它们的导电性可以用多种方法来控制。半导体最外层有 4个电子,是最外层所能容纳
电子最大数目的一半。在纯半导体中,原子彼此非常稳固地结合在一起,具有与金刚石相似
的晶状结构。这种半导体不是好的导体。
但是半导体可以掺杂,意思是与某种杂质相混合。半导体很容易与其他杂质结合而变得
不纯。有一类杂质为原子的结合提供额外的电子,这种半导体叫
N 型半导体( N 表示
n e g a t i v e);另一种类型的杂质掺杂生成 P型半导体。
两个N型半导体中夹一个 P型半导体可制成放大器,称作 N P N晶体管,对应的三部分分别
是集电极( C o l l e c t o r)、基极( B a s e )和发射极( E m i t t e r )。
下面是一个 N P N晶体管的示意图:
集电极
基极
发射极180
编码的奥秘
下载
基极上的一个小电压能控制一个很大的电压经过集电极到发射极。若基极上没有电压,
它会有效截止晶体管。
晶体管通常被封装在一个直径大约为 1 / 4英寸的小金属容器里,有三个引脚伸出:
晶体管首创了固态电子器件,意思是晶体管不需要真空,可由固体做成,特别是指由半
导体和当今最普遍的硅制成。除了比真空管体积更小外,晶体管功耗小,发热少,并且更耐
用。携带一个电子管收音机很不方便。晶体管收音机靠小电池供电,并且不像电子管,它不
会变热。对于 1 9 5 4年圣诞节早晨收到礼物的幸运者来说携带晶体管收音机已成为可能。那些
第一批袖珍晶体管收音机是由德克萨斯仪器公司制造的,该公司是半导体革命中的一个重要
公司。
然而,晶体管的第一个商业应用是助听器。为了纪念贝尔一生为聋人的贡献, AT&T公
司允许助听器生产厂家不用付任何专利权税就可使用晶体管技术。第一台晶体管电视机出现
于1 9 6 0年,而今天,电子管器件几乎已消失了。(然而,并未完全消失,一些高保真发烧友及
电子吉他手还是喜欢用电子管放大器来放大声音而不是用晶体管。)
1 9 5 6年,S h o c k l e y离开贝尔实验室成立 S h o c k l e y半导体实验室。他迁到加利福尼亚的 P a l o
A l t o — 他的成长之地。他的公司是那里成立的第一家从事这种工作的公司。后来,其他半导
体及计算机公司也在那儿建立了业务,于是旧金山南部的这个地方也就成为现在非正式地称
作硅谷(Silicon Va l l e y)的地方。
真空管原是为放大信号而开发的,但它们也用来作为逻辑门的开关。晶体管也是如此。
下面你将会看到一个由晶体管组成的与门在构造上很像用继电器组成的与门。只有当 A 输入
为1且B输入为1时,两个晶体管才都导通,输出才为 1。这里所示的电阻用来防止短路。
正如你所看到的,下图连接了两组晶体管,右边一个是或门,左边一个是与门。在与门
电路里,上面管子的发射极连接到下面管子的集电极。在或门电路里,两个晶体管的集电极
都连到电源,发射极连到一起:
或门
与门
A输入
A输入
B输入
输出
B输入
输出下载
第18章 从算盘到芯片
181
因此,我们所学的有关由继电器构造逻辑门和其他部件的知识也适用于晶体管。继电器、
电子管和晶体管最初主要用来放大信号,但也可用同样的方法连接成逻辑门来建造计算机。
第一台晶体管计算机制造于 1 9 5 6年,短短几年内,新计算机的设计中就放弃使用电子管了。
这里有一个问题:晶体管当然使计算机更可靠,更小和更省电,但晶体管能使计算机的
制造更简单吗?
并非如此。虽然晶体管使得在一个小空间里能安装更多的逻辑门,但你还得担心这些组
件的互连。连接晶体管形成逻辑门像连接继电器和真空电子管一样困难,某种程度上,它甚
至更困难,因为晶体管较小,不容易掌握。如果想用晶体管建造第
1 7章所建造的计算机及
6 4 K B的 R A M阵列,设计工作中的一部分将是设法发明某种能容纳所有组件的结构。这些劳
动是乏味的,需要在数百万晶体管之间建立起数百万连接。
然而,就像我们所发现的,一些晶体管的连接会重复出现。许多对晶体管几乎都是先连
接成门,门再连接成触发器、加法器、选择器或译码器,触发器再组成多位锁存器或 R A M阵
列。如果晶体管事先能连接成通用的结构,那么组装一台计算机就容易多了。
这种思想应该首先由英国物理学家 G e o ffrey Dummer(1909出生)在1 9 5 2年5月的一次演讲
中提出,他说:
“我想预测一下未来。随着晶体管的出现及半导体的日益广泛应用,现在似乎可以设想电
子设备在一个固体块里而无需接线。这个块由隔离、传导、整理、放大四个层组成,电子功
能通过各层的隔离区域直接连接起来。”
然而,真正可用的产品还不得不再等几年。
在对D u m m e r的预言毫不知情的情况下, 1 9 5 8年7月,德克萨斯仪器公司的 Jack Kilby(生
于1 9 2 3年)想到了在一个硅片上造出许多晶体管、电阻及其他电子组件的方法。 6个月以后,
即1 9 5 9年1月,Robert Noyce (1 9 2 7—1 9 9 0)也找到了基本上相同的方法。 N o y c e原先曾为
S h o c k l e y半导体实验室工作过,但在 1 9 5 7 年,他和其他 7位科学家离开实验室并成立了
F a i r c h i l d(仙童)半导体公司。
在技术史上,同时产生的发明很普遍,可能超出了你的想像。尽管 K i l b y比N o y c e早6个月
发明了这项技术,并且德克萨斯仪器公司比仙童公司也早申请专利,但 N o y c e还是首先获得了
专利。法律上的争斗随之而来,但仅过了 1 0年,问题就得到了令他们都满意的解决。尽管他
们从未在一起工作过,但 K i l d y和N o y c e被认为是集成电路,或称 I C,更普遍的是叫芯片的共
同发明者。
集成电路要经过复杂的工序才能生产出来,这些工序包括把很薄的硅晶片分层,精确地
上涂料,和在不同的区域蚀刻形成微部件。尽管开发一种新的集成电路很昂贵,但收益来自
于它的大量生产 — 生产得越多,就越便宜。
实际的硅晶片薄且很脆弱,为了保护芯片并提供某种方法使芯片中的部件与别的芯片连
接,芯片必须安全地封装。集成电路的封装有几种不同的方式,但通常多采用矩形塑料双排
直插式封装(或 dual inline package,D I P),有1 4、1 6或4 0个管脚从旁边伸出:182
编码的奥秘
下载
这是一个 1 6管脚的芯片。如果你拿着芯片,并使芯片上的凹陷朝左时(如图),从芯片左
下角起环绕到右边至末端,管脚依次编号为 1~1 6,第1 6管脚在左上角。每一边管脚之间相距
刚好为1 / 1 0英寸。
2 0世纪6 0年代,空间项目和军备竞赛刺激了早期的集成电路市场。在民用方面,第一个
包含有集成电路的商业产品是 1 9 6 4年由Z e n i t h出售的助听器。 1 9 7 1年,德克萨斯仪器公司开
始出售第一批袖珍计算器,同时 P u l s a r出售了第一块数字表(显然数字手表中集成电路的封装
完全不同于刚才图示的例子)。随后出现了其他很多种包含有集成电路的产品。
1 9 6 5年,戈登・E・摩尔(当时在仙童公司,后来是 I n t e l公司的合伙创始人)注意到技术
以这样一种方式在发展: 1 9 5 9年后,可以集成到一块芯片上的晶体管的数目每年都翻一番。
他预测这种趋势将继续下去。事实上后来这种趋势放慢了些,因此摩尔定律(最终这样命名)
修改为预计每 1 8个月在一个芯片上集成的晶体管数量将增长一倍。这仍是一个令人惊异的增
长速度,这也就解释了为什么家用电脑只用了短短几年好像就已过时了。一些人认为摩尔定
律将继续适用到 2 0 1 5年。
早期,人们习惯于说小规模集成电路,即 S S I(small-scale integration),指那些少于 1 0个
逻辑门的芯片;中规模集成电路,即 M S I(1 0~1 0 0个门);大规模集成电路,即 L S I(1 0 0~
5 0 0 0个门)。随后的术语为超大规模集成电路,即 V L S I(5 000~50 000个门);极大规模集
成电路,即 S L S I(5 0 0 0 0~100 000个门);特大规模集成电路,即超过 100 000个门。
本章的其余部分和下一章将把时钟停留在 2 0世纪7 0年代中期,即第一部《星球大战》发
行前的年代,那时, V L S I刚刚出现,且好几种技术用来制作构成集成电路的组件,每一种技
术有时被称为一个 I C家族。到7 0年代中期,两个“家族”流行开来: T T L和C M O S。
T T L代表晶体管-晶体管逻辑。 7 0年代中期,如果你是一位数字电路设计工程师(即用 I C
来设计大的电路),一本 1 . 2 5英寸厚的、德克萨斯仪器公司于 1 9 7 3年出版的名为《 The TTL
Data Book for Design Engineer》( T T L工程师设计数据手册)的书(以下简称《T T L数据手册》)就
会是你书桌上的常客。这是一本关于德克萨斯仪器公司和其他公司出售的 T T L集成电路7 4 0 0系
列的完整的参考书,之所以这样称呼是因为该家族的 每个集成电路都以开头是7 4的数字标识。
7 4 0 0系列中每一个集成电路由许多预先按特定方式连接的逻辑门组成。一些具备简单的
预先连接的逻辑门的芯片可以用来建造更大的组件。还有一些芯片提供通用组件,如:触发
器、加法器、选择器和译码器。
7 4 0 0系列中第一个集成电路是号码 7 4 0 0本身,它在《 T T L数据手册》里描述为:“四个双
输入正与非门”。这意味着这个特定的集成电路包含四个 2输入与非门。它们之所以称为“正”
与非门是因为有一个电压值与逻辑 1对应,没有电压值与逻辑 0对应。这个集成电路是一个 1 4
管脚的芯片,数据手册中的一个小图展示了管脚对应的输入和输出:下载
第18章 从算盘到芯片
183
该图是芯片的俯视图(管脚在下面),小的凹陷在左边。
管脚1 4标为V C C ,等同于 V符号,它表明是电压 (顺便说一下,大写字母 V的双下标表明是
一个电源,下标中的 C是指晶体管的集电极输入,它在内部连接到电源 )。管脚 7标为 G N D,
表示接地。在特定电路中所使用的任何集成电路都必须接电源和公共地。
对于T T L 7 4 0 0系列,V C C 必须在4 . 7 5~5 . 2 5 V之间,换句话说,电源电压必须在 5 V±5 %的
范围内。若电压低于 4 . 7 5 V,芯片就无法工作;若超过 5 . 2 5 V,芯片则会被烧坏。通常 T T L器
件不能使用电池供电,即使你刚好有一个 5 V的电池,电压也不可能刚好适合于芯片。 T T L通
常需要从墙上接入电源。
7 4 0 0芯片中每一个与非门有两个输入和一个输出,它们独立工作。前面曾把输入用 1(表
明有电压)和 0(表明无电压)加以区分,实事上与非门的输入电压可在 0(地)~ 5 V(V C C )
之间变化。 T T L中,0~0 . 8 V之间的电压视为逻辑“ 0”,2~5 V之间的电压视为逻辑“ 1”,应
当避免出现0 . 8~2 V之间的输入电压。
T T L的典型输出是 0 . 2 V代表逻辑“ 0”,3 . 4 V代表逻辑“ 1”。由于电压可能会有点儿变化,
集成电路的输入 /输出有时称作“高”或“低”,而不是“ 1”或“ 0”。此外,低电平也可以表
示逻辑“ 1”,高电平也可以表示逻辑“ 0”,这种说法称为负逻辑。当 7 4 0 0芯片称作“四个双
输入正与非门”时,“正”就表示上面讲到的正逻辑。
如果T T L的典型输出是 0 . 2 V代表逻辑“ 0”,3 . 4 V代表逻辑“ 1”,则输出确实是在输入范
围内,即逻辑“ 0”在0~0 . 8 V、逻辑“ 1”在2~5 V之间,这也是 T T L能隔离噪声的原因。一
个“ 1”输出即使下降 1 . 4 V 后,电压仍可以高到作为“ 1”电平输入;一个“ 0”输出升高
0 . 6 V后,电压仍可以低到作为“ 0”电平输入。
了解一个集成电路最重要的事实可能是它的延迟时间,这指的是输入变化反应到输出所
花费的时间。
芯片的延迟通常以纳秒来计算,纳秒缩写为 n s。1纳秒非常短暂,千分之一秒为 1毫秒,
百万分之一秒为1微秒,十亿分之一秒才是 1纳秒。 7 4 0 0芯片与非门的延迟时间要保证少于
2 2纳秒,也就是 0 . 0 0 0 0 0 0 0 2 2秒,或十亿分之 2 2秒。
不能感觉纳秒的长短不仅仅是你一人,地球上任何人除了对纳秒有智力上的理解之外就
没有什么了。纳秒比人所经历的任何事物要短暂得多,所以它们永远也不会被理解,任何解
释都只会使纳秒变得更难以捉摸。例如,你拿着一本书离你的脸有一英尺远,那么 1纳秒就是
光从书到你的眼所用的时间。现在,你能说你对纳秒有了更好的认识?
然而,纳秒在计算机中出现是可能的。正如在第 1 7章所见,计算机处理器很笨拙地做着
简单的事情 — 从存储器中取一个字节到寄存器,把一个字节同另一个字节相加,再把结果
存回存储器。计算机(不是第 1 7章中的计算机,而是现在使用的计算机)能做大量事情的唯
一原因就是那些操作能迅速执行。引用 Robert Noyce的话:“当你理解了纳秒之后,在概念上
计算机操作就相当简单了。”
我们继续细读《 T T L工程师设计数据手册》,就会在书中看到许多熟悉的小条目。 7 4 0 2芯
片有四个双输入或非门, 7 4 0 4有六个反相器, 7 4 0 8有四个双输入与门, 7 4 3 2有四个双输入或
门,7 4 3 0有一个8输入与非门:184
编码的奥秘
下载
图中缩写N C表示该引脚没有连接到内部电路。
7 4 7 4芯片是听起来很熟悉的一个芯片,它是“带预置和清零的双 D型正边沿触发器”。如
下图示:
T T L数据手册甚至还包含这个芯片的每个触发器的逻辑图:
预置
清零
时钟
你会发现这与第 1 4章结尾处的图很相似,只是第 1 4章的图中使用的是或非门。《T T L数据
手册》中的逻辑表也有一点点不同:第18章 从算盘到芯片
下载
输入
185
输出
上表中,“H”代表高电平,“L”代表低电平。你也可以把它们想成是 1或0。在上述触发
器里,预置与清零输入通常为“ 0”,在这里它们为“ 1”。
继续翻阅《T T L数据手册》,你会发现 7 4 8 3芯片是一个 4位二进制全加器,7 4 1 5 1是一个8 - 1
数据选择器, 7 4 1 5 4是4 - 1 6译码器, 7 4 1 6 1是同步4位二进制计数器, 7 4 1 7 5是四个带清除功能
的D型触发器。你可以选择这些芯片中的两个做一个 8位锁存器。
所以现在你该明白从第 11章起使用的各种各样的组件是如何来的了,它们都是从《 T T L
工程师设计数据手册》中得来的。
作为一名数字电路设计工程师,需要花费大量的时间去通读《 T T L数据手册》,了解要使
用的T T L芯片的类型。一旦掌握了你所需要的工具,你就可以用 T T L芯片实际组装第 1 7章所示
例的计算机。把芯片连接起来要比连接晶体管容易得多,然而你可能不想用 T T L组成6 4 K B的
R A M阵列。在 1 9 7 3年的《 T T L数据手册》中,所列最大容量的 R A M芯片才 2 5 6×1位,需要
2 0 4 8个这种芯片才能组成 6 4 K B的R A M!T T L远不是组织存储器的最好技术,第 2 1章将要更多
地谈到关于存储器的事情。
你可能也想用好一些的振荡器。可以将 T T L反相器的输出端连到输入端,但使用一个事
先可预测频率的振荡器要更好一些。构造一个这样的振荡器很容易,就是使用一个石英晶体,
在一块小片上引出两条线。这些晶体在特定的频率下产生振荡,通常每秒至少 1 0 0万周。每秒
一百万周称为兆赫,缩写为 M H z。如果第 1 7章所示的计算机是用 T T L构造的话,那么它在
1 0 M H z的时钟频率下可能会运行地很好。每一条指令需要 4 0 0纳秒的执行时间。当然,这已经
比用继电器工作时所能想像的要快多了。
另一个流行的芯片家族是(现在仍然是) C M O S,它代表由金属氧化物填充的半导体。
如果你是 7 0年代中期用 C M O S集成电路进行电路设计的业余爱好者,你可能会使用一本由
National Semicondactor(国家半导体公司 )出版的参考书,它在你所在地方的电器行就能见到,
书名为《CMOS Databook》。此书包含了C M O S集成电路4 0 0 0系列的信息。
T T L的电源要求是在 4 . 7 5~5 . 2 5伏之间,但 C M O S则可以是 3~1 8伏之间的任何数值,范
围多么大呀!此外, C M O S比T T L功耗要小,这就可以使用电池来驱动小型 C M O S电路。
C M O S的缺陷是速度慢。例如, CMOS 4008 4位全加器在 5伏电压下只能保证 7 5 0纳秒的延迟。
当电源电压升高时,速度加快 — 1 0伏时,延迟为 2 5 0纳秒; 1 5伏时,延迟为 1 9 0纳秒。但是
C M O S设备不能接近于 TTL 4位加法器, TTL 4位加法器的延迟为 2 4纳秒。(2 5年前,在T T L的
速度和C M O S的低功耗之间的权衡是很清楚的,今天,也有低功耗的 T T L和高速率的 C M O S。)
实践上,你可以在塑料面包板上连接这些芯片进行实验:186
编码的奥秘
下载
每一个有 5个孔的短行在塑料板下是电导通的。你把芯片插在面包板上,并使芯片跨在中
间的长槽上,管脚插入槽两边的孔中。集成电路的每一个管脚都与其他 4个孔电连接。你可以
将线插入其余孔中来连接芯片。
你也可以使用一种称为线缠绕的技术使芯片的连接更加牢固。每一个芯片插入带有长方
形柱子的插座上:
每一个柱子对应于芯片的一个管脚,插座本身也插入打孔的板上。在板的另一边,你会
看到特殊的用线缠绕的插槽紧紧包裹着围绕柱子的绝缘线。柱子的方形边缘穿破绝缘层并使
它和导线电连接。
如果你实际在使用集成电路来构造一个电路,就要使用一块印刷线路板。以前,这是业
余爱好者可以做的事情。板子上有孔,并覆盖一层薄的铜箔。首先,你要在需要保护的区域
的铜箔上涂上防酸物,并用酸腐蚀其余部分,然后你把集成电路插座(或集成电路本身)直
接焊在板的铜上。由于集成电路之间有许多内部连接,一层铜箔通常是不够用的,商业制造
的印刷线路板有许多内部互连的层。
到7 0年代早期,已可以在一块电路板上用集成电路构造一个完整的计算机处理器。把整
个处理器做在一块芯片上已只是时间问题。尽管德克萨斯仪器公司 1 9 7 1年为单片计算机申请
了专利,但实际的制造荣誉却属于 I n t e l — 一家于 1 9 6 8年,由前仙童雇员 Robert Noyce 和
Gordon Moore 建立的公司。 I n t e l的第一个主要产品是 1 9 7 0年生产的可存储 1 0 2 4位的存储器芯
片,在当时这是可做在一块芯片上的最大存储容量。
I n t e l在为由日本的 B u s i c o m公司生产的可编程计算器设计芯片时,决定采用不同的方法。
正如I n t e l公司的工程师Ted Hoff写的:“不是想使他们的设备成为一个带有编程能力的计算器,
而是想使它作为通常目的计算机可编程为一个计算器”。这就产生了Intel 4004,第一个“芯片
上的计算机”或微处理器。 1 9 7 1年11月,4 0 0 4投入使用,它带有 2 3 0 0个晶体管。(根据摩尔定
律,1 8年后微处理器应该有 4 0 0 0倍数量的晶体管,即大约 1 0 0 0万个,这是相当准确的预计。)
有了晶体管的数量,下面将描述 4 0 0 4的其他三个很重要的特性。自 4 0 0 4诞生以来,这三
个指标经常用来作为微处理器相互比较的标准。
第一, 4 0 0 4是4位的微处理器。这意味着处理器的数据通路宽度只有 4位,做加、减法运
算时,它一次只处理 4位。相比较,第 1 7章中开发的计算机有 8位数据通路,所以它是 8位处理下载
第18章 从算盘到芯片
187
器。正如我们将看到的 4位微处理器很快就被 8位微处理器所超越,没有人会停滞不前。 7 0年
代后期, 1 6位微处理器出现了。回想一样第 1 7章的内容,以及在 8位处理器上进行两个 1 6位数
相加所需要的指令代码,你就会欣赏 1 6位处理器带给你的好处。 8 0年代中期, 3 2位微处理器
出现了,并从那以后一直作为家用计算机的主流微处理器。
第二, 4 0 0 4有最大每秒 108 000 周的时钟频率,即 1 0 8 K H z。时钟频率是可连接到微处理
器并能运行的振荡器的最大频率。再要快的话,微处理器就可能出错。到 1 9 9 9年,家用计算
机微处理器的时钟频率已达到 5 0 0 M H z — 大约4 0 0 4运行速率的 5 0 0 0倍。
第三,4 0 0 4可寻址的存储器是 6 4 0个字节。这看起来是一个小得可笑的数字,然而这和当
时可用的存储芯片的容量是相匹配的。下一章你就会看到,两年内微处理器可达到 6 4 K B的寻
址空间,这是第 1 7章所提及的机器的容量。到 1 9 9 9年,I n t e l的微处理器已达 6 4 T B的可寻址空
间,尽管大多数人家用电脑的 R A M容量还低于 2 5 6 M B。
这三个数字不会影响一台计算机的能力。例如,一个 4位处理器要进行 3 2位数的加法,只
要简单地按 4位一次进行。某种意义上,所有数字计算机都是相同的。如果一个处理器的硬件
能做别的处理器做不了的,那么别的处理器可以用软件实现,最终它们能做同样的事情。这
也就是图灵 1 9 7 3年的论文里有关计算能力的含义。
然而,处理器根本的不同是在速度上。同时,速度也是我们为什么使用计算机的一个重
要原因。
最大时钟频率是影响处理器总体速度的一个显著因素,时钟频率决定了每一条指令的执
行速度。处理器的数据宽度也影响其执行速度。虽然一个 4位处理器可进行 3 2位数的加法运算,
但它的执行速度不可能与 3 2位处理器一样。然而,令人迷惑的是,处理器可寻址的最大存储
器容量也是影响速度的一个因素。最初,寻址空间看起来好像与处理器速度无关,而只反映
了处理器在执行某些需要大量存储空间的功能时处理器的能力限度。但处理器通过利用存储
器地址来控制用于保存或提取信息的其他媒体,可避开存储容量的限制。(例如,假设写到某
个存储地址的每个字节实际上都是在纸带上穿孔,从存储地址读的每个字节都是从纸带上读。)
然而这种做法减慢了整个计算机的处理速度 — 又是速度问题。
当然,这三个数字都只是初略地显示了微处理器的运行速度。这些数字没有告诉任何有
关微处理器内部体系结构或机器码指令的效率和能力的问题。处理器越来越复杂,许多以前
用软件来实现的普通工作现在可以用微处理器来实现。我们在后面的各章中可看到这种趋势
的一些例子。
即使所有的数字计算机都具有同等的能力,即使它们只能做与图灵设计的原始计算机器
一样的工作,处理器的执行速度最终也会影响计算机系统的总体用途。例如,比人类大脑的
计算速度还慢的计算机是毫无用处的。当我们在现代计算机的屏幕上看电影时,如果处理器
需要花费1分钟的时间来处理每一帧,我们也是无法忍受的。
回到2 0世纪7 0年代中期,先不说 4 0 0 4的局限性,但毕竟它是一个开始。 1 9 7 2年4月,I n t e l
发布了8 0 0 8 — 一个8位微处理器,时钟频率为 2 0 0 K H z,可寻址1 6 K B的存储空间。(仅用三个
数来总结一个处理器是多么容易。)后来, 1 9 7 4年5月期间, I n t e l和M o t o r o l a公司同时发布了
对8 0 0 8进行改进的微处理器,这两种芯片改变了整个世界。下载
第19章 两种典型的微处理器
微处理器 — 集成计算机中央处理器( C P U)的所有组件在一个硅芯片上 — 诞生于1 9 7 1
年。它的产生有一个很好的开端:第一个微处理器是 Intel 4004,其中有2 3 0 0个晶体管。今天,
差不多3 0年过去了,为家用计算机所制造的微处理器中将近有 10 000 000个晶体管。
微处理器实际的作用基本上保持不变。现在的芯片上附加的上百万个晶体管可以做许多有
趣的事情,但在微处理器最初的探索过程中,这些事情更多的是分散我们的注意力而不是给我
们以启迪。为了对微处理器的工作情况获得更清晰的认识,让我们先看一下最初的微处理器。
这些微处理器出现在 1 9 7 4年。在该年度, I n t e l公司在4月推出了 8 0 8 0,M o t o r o l a(摩托罗
拉) — 从2 0世纪5 0年代开始生产半导体和晶体管产品的公司 — 在8月份推出了 6 8 0 0。它们
并非是那年仅有的微处理器。同样是在 1 9 7 4年,德克萨斯仪器公司推出了 4位的TMS 1000,用
在许多计算器、玩具和设备上; National Semiconductor(国家半导体公司)推出了 PA C E,它
是第一个1 6位的微处理器。然而,回想起来, 8 0 8 0和6 8 0 0是两个最具有重大历史意义的芯片。
I n t e l设定8 0 8 0最初价格为 $ 360,这是对IBM System/360的一个讽刺。IBM System/360是
一个大型机系统,由许多大公司使用,要花费几百万美元。(今天,你只花 $ 1 . 9 5就可以买到
一个8 0 8 0芯片。)这并不是说 8 0 8 0可以与S y s t e m / 3 6 0相提并论,但不用几年, I B M公司也将会
正视这些很小的计算机。
8 0 8 0是一个8位的微处理器,有 6 0 0 0个晶体管,时钟频率为 2 M H z,可寻址 6 4 K B的存储空
间。6 8 0 0(今天也只卖$ 1 . 9 5)有大约4 0 0 0个晶体管,也可寻址 6 4 K B的存储空间。第 1代6 8 0 0
的时钟频率为 1 MHz,但到 1 9 7 7年M o t o r o l a公司发布新款的 6 8 0 0时,其时钟频率已为 1 . 5 M H z
和2 MHz 。
这些芯片称作“单芯片微处理器”,不太准确的名称为“一个芯片上的计算机”。处理器
只是整个计算机的一部分。此外,计算机至少还需要一些随机访问存储器( R A M)、供人们
输入信息到计算机的方法(输入设备),供人们从计算机获取信息的方法(输出设备),以及
其他可把所有这些东西连接在一起的芯片。这些组件将在第 2 1章详细介绍。
从现在起,我们只考察微处理器。描述微处理器时,通常是用框图来画微处理器的内部
组件及它们是如何连接的。但在第 1 7章已有够多的图了,现在,我们将通过观察处理器与外
界的相互作用来了解它的内部 。换句话说,为了弄清楚它的作用,可以把微处理器看成是一
个黑盒子,它的内部操作不需要做详细研究。我们可以通过测试芯片的输入和输出信号,特
别是芯片的指令集来掌握微处理器的功能。
8 0 8 0和6 8 0 0都是4 0管脚的集成电路。这些芯片最普通的 I C封装大约是 2英寸长,半英寸宽,
1 / 8英寸厚:下载
第19章 两种典型的微处理器
189
当然,你看到的只是外包装。位于其内部的硅晶片非常小,就拿早期的 8位微处理器来说,
其硅晶片小于1 / 4平方英寸。外包装保护硅晶片并通过管脚提供对芯片的输入和输出点的访问。
下图显示了 8 0 8 0的4 0个管脚的功能:
本书的所有电气或电子设备都需要某种电源供电。 8 0 8 0的一个特别之处在于它需要三种
电源电压:管脚 2 0必须连到 5伏电源上,管脚 11连到- 5伏电源上,管脚 2 8连到1 2伏电源上;管
脚2接地(1 9 7 6年,I n t e l发布了8 0 8 5芯片,简化了这些电源需求)。
其余管脚都画有箭头。从芯片中出来的箭头表示输出信号,这是由微处理器控制的信号,
计算机中其余芯片对此作出响应。指向芯片的箭头表示输入信号,这是来自于其他芯片的信
号,8 0 8 0对它们做出响应。有些管脚既是输入又是输出。
第1 7章的处理器需要振荡器使它工作。 8 0 8 0需要两个不同的 2 MHz 同步时钟输入,在 2 2
和1 5管脚上分别标记为 ∅ 1 和∅ 2 。这些信号可以很方便地由 I n t e l公司生产的 8 2 2 4时钟信号发生
器提供。给这个芯片连上一个 18 MHz的石英晶体,剩下的工作它基本上可以完成。
一个微处理器通常有多个输出信号来寻址存储空间,这种信号的数目与微处理器可寻址
的存储器空间的大小直接相关。 8 0 8 0有1 6个地址信号,标为 A 0~A 1 5,具有寻址 2 1 6 即65 536
字节的存储空间的能力。
8 0 8 0是一个 8位微处理器,一次可从存储器中读出、写入 8位数据。它包括 8个数据信号
D 0 ~ D 7 ,这些信号是在此芯片中仅有的几个既作为输入又作为输出的信号。当微处理器从存储
器读数据时,这些管脚作为输入;当微处理器向存储器写数据时,这些管脚作为输出。
微处理器的另外 1 0个管脚是控制信号。例如, R E S E T输入用来复位微处理器。输出信号
-
- R信号对应于 R A M阵列的写入输入。)另外,当芯
W R表示微处理器要向 R A M中写数据。( W
片读取指令时,其他控制信号会在某个时候出现在 D 0 ~ D 7 管脚。由 8 0 8 0构成的计算机系统通常
使用8 2 2 8系统控制芯片来锁存这些附加的控制信号。后面将会讲述一些控制信号。由于 8 0 8 0
的控制信号非常复杂,因此,除非你想基于 8 0 8 0芯片来实际设计计算机,否则最好不要用这
些控制信号来折磨自己。190
编码的奥秘
下载
假定8 0 8 0微处理器连接了 6 4 K B的存储器,这样可以不通过微处理器来读写数据。
8 0 8 0芯片复位后,它从存储器的地址 0 0 0 0 h处读取该字节,送到微处理器中。这可以通过
在地址信号端 A 0 ~A 1 5 输出1 6个0来实现。它读取的字节必须是 8 0 8 0指令,这种读取字节的过
程叫作取指令。
在第1 7章构造的计算机里,所有指令(除了停止指令 H LT)都是3个字节长,包括一个操
作码和两个字节的地址。在 8 0 8 0中,指令长度可以是 1个字节、2个字节或3个字节。有些指令
可使8 0 8 0从存储器的某一位置处读出一个字节送到微处理器中;有些指令可使 8 0 8 0从微处理
器中把数据写入存储器的某一位置处;其他指令可使 8 0 8 0不使用 R A M而在内部执行。第一条
指令执行完后, 8 0 8 0访问存储器中的第二条指令,依此类推。这些指令组合在一起构成一个
计算机程序,用来完成一些自己感兴趣的事情。
当8 0 8 0运行在最高速度即 2 MHz 时,每个时钟周期为 5 0 0纳秒( 1除以 2 000 000 周等于
0 . 0 0 0 0 0 0 5 0 0秒)。第1 7章中的每条指令都需要 4个时钟周期, 8 0 8 0的每条指令则需要 4~1 8个
时钟周期,这意味着每条指令的执行时间为 2~9微秒(即百万分之一秒)。
了解微处理器功能的最好方法可能是在系统方式下测试其完整的指令集。
第1 7章最后出现的计算机仅有 1 2条指令。一个 8位微处理器很容易就有 2 5 6条指令,每个操
作码对应于某个 8位值。(如果一些指令有2个字节的操作码,则实际会有更多的指令)。8 0 8 0虽
没有那么多,但它也有 2 4 4条操作码。这看起来似乎很多,但总的来说,却又不比第 1 7章中的
计算机功能多多少。例如,如果想用 8 0 8 0做乘法或除法,仍然需要写一段小程序来实现。
第1 7章中讲过,处理器指令集的每个操作码都和某个助记符相联系,有些助记符之后可
能还有操作数。但这些助记符仅用来方便地表示操作码。处理器只读取字节,它并不懂组成
这些助记符的字符的含义。
第1 7章中的计算机有两条很重要的指令,称作装载( L o a d)和保存( S t o r e)指令。这些
指令都占用三个字节的存储空间。装载指令的第一个字节是操作码,操作码后的两个字节表
示1 6位地址。处理器把在此地址中的字节送到累加器。同样,保存指令把累加器中的内容存
储到指令指定的地址处。
下面,我们用助记符来简写这两个操作:
LOD A ,[aaaa]
STO [aaaa],A
在此, A表示累加器(装载指令的目的操作数,保存指令的源操作数),a a a a表示一个 1 6
位的存储器地址,通常用 4位十六进制数来表示。
8 0 8 0中的8位累加器称作 A,就像第 1 7章中的累加器。正如第 1 7章中的计算机一样, 8 0 8 0
也有两条与装载和保存指令功能一样的指令。 8 0 8 0中这两条指令的操作码为 3 2 h和3 A h,每个
操作码后有一个 1 6位地址。 8 0 8 0的助记符为 S TA(代表存储累加器的内容)和 L D A(代表装
载到累加器):
操作码 指令
3 2 S TA [aaaa],A
3 A LDA A,[aaaa]
除了累加器,8 0 8 0微处理器内部还包括 6个寄存器( r e g i s t e r),每个寄存器可以保存 8位的
值。这些寄存器和累加器非常相似,事实上,累加器被看作是一种特殊的寄存器。和累加器第19章 两种典型的微处理器
下载
191
一样,这 6个寄存器也是锁存器。处理器可以把数据从存储器传送到寄存器,也可以把数据从
寄存器送回到存储器。然而,这些寄存器没有累加器的功能强大。例如,当两数相加时,其
结果通常送往累加器而非其中一个寄存器。
在8 0 8 0中,除累加器外的 6个寄存器的名字分别为 B,C,D,E,H和L。人们通常问的第
一个问题是“用 F和G干什么?”,第二个问题是“用 I,J和K又要做什么?”,答案是使用寄
存器H和L具有某种特殊的含义。 H代表高(H i g h),L代表低( L o w )。通常把 H和L的8位合起来
记作H L来表示一个 1 6位寄存器对,H作为高位字节, L作为低位字节。这个 1 6位值通常用来寻
址存储器。后面我们将看到它的简单用法。
所有这些寄存器都是必需的吗?为什么不在第 1 7章中的计算机中用到它们呢?从理论上
说,它们并非必需,但是使用它们会很方便。许多计算机程序在同一时刻要用到几个数据,
如果所有这些数据都存储在微处理器的寄存器中而非存储器中,执行程序将会更快,因为程
序访问存储器的次数越少,那么它的运行速度也就越快。
8 0 8 8指令中,有一个至少 6 3个指令码供一条 8 0 8 0指令使用的指令,它就是 M O V指令,即
M o v e的简写。该条指令只有一个字节,用于把一个寄存器中的内容传送到另一个寄存器中
(或同一个寄存器中)。使用大量 M O V指令是设计带有 7个寄存器(包括累加器)的微处理器
的正常结果。
下面是前3 2条M O V指令。记住目的操作数在左边,源操作数在右边:
操作码
指令
操作码 指令
MOV D ,B
4 0 MOV B ,B 5 0 4 1 MOV B ,C 5 1 MOV D ,C
4 2 MOV B ,D 5 2 MOV D ,D
4 3 MOV B ,E 5 3 MOV D ,E
4 4 MOV B ,H 5 4 MOV D ,H
4 5 MOV B ,L 5 5 MOV D ,L
4 6 MOV B ,[ H L ] 5 6 MOV D ,[ H L ]
4 7 MOV B ,A 5 7 MOV D ,A
4 8 MOV C ,B 5 8 MOV E ,B
4 9 MOV C ,C 5 9 MOV E,C
4 A MOV C ,D 5 A MOV E ,D
MOV E ,E
4 B MOV C ,E 5 B 4 C MOV C ,H 5 C MOV E ,H
4 D MOV C ,L 5 D MOV E ,L
4 E MOV C ,[ H L ] 5 E MOV E ,[ H L ]
4 F MOV C ,A 5 F MOV E ,A
这些都是很方便的指令。当一个寄存器中有值时,可以把它传送到其他寄存器中。注意,
上述指令中有四条指令用到 H L寄存器对,如:
MOV
B,[HL]
前面列出的 L D A指令把一个字节从存储器中传送到累加器中,这个字节的 1 6位地址直接
跟在L D A操作码的后面。这里的 M O V指令把一个字节从存储器中传送到寄存器 B中,但被装
载到寄存器中的字节的地址是保存在寄存器对 H L中。H L寄存器是怎样得到 1 6位存储器地址的
呢?它可以通过多种方法来实现,或许是通过某种方法计算出来的。192
编码的奥秘
下载
总之,这两条指令
LDA
MOV
A,[aaaa]
B,[HL]
都把一个字节从存储器中装载到微处理器中,但它们用两种不同的方法来寻址存储器地
址。第一种方法叫作直接寻址方式,第二种方法叫作间接寻址方式。
第二批3 2条M O V指令表明用 H L寻址的存储器地址也可以作为目的操作数:
操作码 指令 操作码
6 0
6 1
6 2
6 3
6 4
6 5
6 6
6 7
6 8
6 9
6 A
6 B
6 C
6 D
6 E
6 F MOV H ,B
MOV H ,C
MOV H ,D
MOV H ,E
MOV H ,H
MOV H ,L
MOV H ,[ H L ]
MOV H ,A
MOV L ,B
MOV L ,C
MOV L ,D
MOV L ,E
MOV L ,H
MOV L ,L
MOV L ,[ H L ]
MOV L ,A 7 0
7 1
7 2
7 3
7 4
75
7 6
7 7
7 8
7 9
7 A
7 B
7 C
7 D
7 E
7 F
指令
MOV [HL],B
MOV [HL],C
MOV [HL],D
MOV [HL],E
MOV [HL],H
MOV [HL],L
H LT
MOV [HL],A
MOV A ,B
MOV A ,C
MOV A ,D
MOV A ,E
MOV A ,H
MOV A ,L
MOV A ,[ H L ]
MOV A ,A
其中一些指令如:
MOV
A,
A
做的是无用的事,而像:
MOV
[HL],[HL]
这样的指令是不存在的。和这条指令相对应的操作码实际上是停止指令。
观察这些M O V操作码更明显的方法是考察它的位模式, M O V操作码由8位组成:
01dddsss
其中字母ddd 代表指代目的操作数的 3位代码,s s s代表指代源操作数的3位代码。这3位代码是:
000= 寄存器 B
001= 寄存器 C
010= 寄存器 D
0 11= 寄存器 E
100= 寄存器 H
101= 寄存器 L
110= HL 中保存的存储器地址中的内容
111= 累加器A
例如,指令:
MOV
L , E
相应的操作码表示为 0 11 0 1 0 11,或6 B h。可以通过检查前面的表来验证。第19章 两种典型的微处理器
下载
193
因此可能在 8 0 8 0内部某个地方,标有 s s s的3位标识用在 8 - 1数据选择器中,标有 d d d的3位
标识用于控制3 - 8译码器,此译码器用来决定哪一个寄存器锁存了一个值。
也可能使用寄存器 B和C来构成一个 1 6位寄存器对 B C,用寄存器 D和E来构成一个 1 6位寄
存器对 D E。如果每一个寄存器对都包含用于装载或保存一个字节的存储器地址,则可以使用
下述指令:
操作码
操作码 指令
0 2 S TAX [BC] ,A
指令
0 A LDAX A ,[ B C ]
1 2 S TAX [DE] ,A 1 A LDAX A ,[ D E ]
另一种类型的传送指令叫做传送立即数,指定的助记符为 M V I。传送立即数指令占两个
字节,第一个是操作码,第二个是 1个字节的数据。此字节从存储器中传送到一个寄存器中或
由H L寻址的存储单元中。
操作码
06 MVI
0 E
16 MVI
1 E
26 MVI
2 E
3 6
3 E
指令
B,x x
MVI C ,x x
D,x x
MVI E ,x x
H,x x
MVI L ,x x
MVI [HL],x x
MVI A ,x x
例如,当指令:
MVI
E,37h
执行后,寄存器 E中包含有字节3 7 h。这就是第三种寻址方式,即立即数寻址方式。
3 2个操作码的集合完成四种基本算术运算,那是在第 1 7章开发处理器时我们就已熟悉的
运算,即加法( A D D)、进位加法( A D C)、减法( S U B)和借位减法( S B B)。所有情况中,
累加器是两个操作数之一,也是结果的目的地址。
操作码 指令 操作码 指令
SUB A ,B
8 0 ADD A ,B 9 0 8 1 ADD A ,C 9 1 SUB A ,C
8 2 ADD A ,D 9 2 SUB A ,D
8 3 ADD A ,E 9 3 SUB A ,E
8 4 ADD A ,H 9 4 SUB A ,H
8 5 ADD A ,L 9 5 SUB A ,L
8 6 ADD A ,[ H L ] 9 6 SUB A ,[ H L ]
8 7 ADD A ,A 9 7 SUB A ,A
8 8 ADC A ,B 9 8 SBB A ,B
8 9 ADC A ,C 9 9 SBB A ,C
8 A ADC A ,D 9 A SBB A ,D
8 B ADC A ,E 9 B SBB A ,E
8 C ADC A ,H 9 C SBB A ,H
8 D ADC A ,L 9 D SBB A ,L
8 E ADC A ,[ H L ] 9 E SBB A ,[ H L ]
8 F ADC A ,A 9 F SBB A ,A194
编码的奥秘
下载
假设A中是3 5 h ,寄存器B中是2 2 h ,当指令:
SUB
A,B
执行后,累加器中的结果为 1 3 h。
若A中的值为 3 5 h ,寄存器 H中的值为 1 0 h,L中的值为 7 C h,存储器地址 1 0 7 C h中的值为 4 A
h,则指令:
ADD A,[HL]
把累加器中的内容( 3 5 h )和通过寄存器对 H L寻址得到的值( 4 A h)相加,并把结果
(7 F h)保存到累加器中。
A D C和S B B指令允许8 0 8 0加/减1 6位、2 4位、3 2位和更多位的数。例如,假设寄存器对 B C
和D E都包含1 6位数,你想把它们相加,并把结果存到 B C中。下面是具体做法:
MOV A,C
ADD A,E
MOV C,A
MOV A,B
ADC A,D
MOV B,A
;低位字节
;高位字节
其中有两条加法指令, A D D指令用于低位字节相加, A D C指令用于高位字节相加。第一
条加法指令的进位位包含在第二条加法指令中。因为只能利用累加器进行加法运算,所以在
这么短的代码中也需要至少 4条M O V指令。许多 M O V指令常常出现在 8 0 8 0代码中。
该是谈论8 0 8 0标志位的时候了。在第1 7章的处理器中,已有进位标志位 C F和零标志位 Z F。
8 0 8 0还有3个标志位,即符号标志位 S F、奇偶标志位 P F和辅助进位标志位 A F。所有标志位都
保存在另一个叫作程序状态字( P S W:program status word)的8位寄存器中。像 L D A、S TA
和M O V这样的指令不影响标志位,而 A D D、S U B、A D C和S B B指令却要影响标志位,影响的
方式如下:
• 当运算结果最高位为 1时,符号标志位 S F为1,表示结果为负。
• 当结果为0时,零标志位Z F为1。
• 当运算结果中“ 1”的个数为偶数时,奇偶标志位 P F = 1;当运算结果中“ 1”的个数为
奇数时,奇偶标志位 P F = 0。P F有时用来粗略地检测错误,此标志位在 8 0 8 0程序中不常
用。
• 当A D D或A D C运算产生进位或 S U B与S B B运算不发生借位时,进位标志位 C F = 1。(这点
不同于第1 7章中的计算机进位标志的实现。)
• 当操作结果的低 4位向高 4位有进位时,辅助进位标志位 A F = 1。此标志位只用在 D A A
(十进制调整累加器)指令中。
有两条指令直接影响进位标志位 C F:
操作码
3 7
3 F
指令
S T C
C M C
含义
置C F为1
C F取反



1<词>,2[句],3/段\,4{节},5(章)。
2016-2-9 10:03
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zzz19760225
超级版主




积分 3673
发帖 2020
注册 2016-2-1
状态 离线
『第 30 楼』:  

第1 7章中的计算机可执行 A D D、A D C、S U B和S B B指令(尽管没什么灵活性),但8 0 8 0还
可以进行逻辑运算 A N D(与)、O R(或)和X O R(异或)。算术运算和逻辑运算都可通过处理
器的算术逻辑单元( A L U)来执行:第19章 两种典型的微处理器
下载
操作码
指令
操作码
AND A ,B
AND A ,C
AND A ,D
AND A ,E
AND A ,H
AND A ,L
AND A ,[ H L ]
AND A ,A
XOR A ,B
XOR A ,C
XOR A ,D
XOR A ,E
XOR A ,H
XOR A ,L
XOR A ,[ H L ]
XOR A ,A
A 0
A 1
A 2
A 3
A 4
A 5
A 6
A 7
A 8
A 9
A A
A B
A C
A D
A E
A F
B 0
B 1
B 2
B 3
B 4
B 5
B 6
B 7
B 8
B 9
B A
B B
B C
B D
B E
B F
195
指令
OR A ,B
OR A,C
OR A ,D
OR A ,E
OR A,H
OR A,L
OR A,[ H L ]
OR A ,A
CMP A ,B
CMP A ,C
CMP A ,D
CMP A ,E
CMP A ,H
CMP A ,L
CMP A ,[ H L ]
CMP A ,A
A N D、X O R和O R指令按位运算,即逻辑操作只是单独地在对应位之间进行。例如:
MVI A,0Fh
MVI B,55h
AND A,Bh
累加器中的结果将为 0 5 h。如果第三条指令为 O R运算,则结果为 5 F h;如果第三条指令为
X O R运算,则结果为 5 A h。
C M P(比较)指令与 S U B 指令基本上一样,除了结果不保存在累加器中。换句话说,
C M P执行减法操作再把结果扔掉。这是为什么?是因为标志位。根据标志位的状态可知道所
比较的两数之间的关系。例如,当如下指令:
MVI B,25h
CMP A,
B
执行完时, A中的内容没有改变。然而,若 A中的值为 2 5 h,则Z F标志置位;若 A中的值
小于2 5 h,则CF = 1。
这8个算术逻辑运算也可以对立即数进行操作:
操作码 指令 操作码 指令
C 6
C E
D 6
D E ADI A ,x x
ACI A ,x x
SUI A,x x
SBI A ,x x E 6
E E
F 6
F E ANI A ,x x
XRI A ,x x
ORI A ,x x
CPI A ,x x
例如,上面列出的两条指令也可以用下面的指令来替换:
CPI
A,25h
下面是其他两条 8 0 8 0指令:
操作码
2 7
2 F
指令
D A A
C M A
C M A即complement accumulator,它对累加器中的值进行取反操作。每个 0变为1,每个1196
编码的奥秘
下载
变为0。如果累加器中的值为 0 11 0 0 1 0 1,C M A指令使它变为 1 0 0 11 0 1 0。也可以用下述指令来
使累加器按位取反:
XRI
A,FFh,
D A A即Decimal Adjust Accumulator,如前所述,它可能是 8 0 8 0中最复杂的一条指令。微
处理器中有一个完整的小部件专门用于执行这条指令。
D A A指令帮助程序员用 B C D码表示的数来进行十进制算术运算。在 B C D码中,每一小块
数据的范围在 0 0 0 0~1 0 0 1之间,对应于十进制的 0~9。利用B C D码格式,每 8位字节可存储两
个十进制数字。
假设累加器中的值为 B C D码的2 7 h。由于是 B C D码,则它实际上指的是十进制的 2 7。(十
六进制的2 7 h等于十进制的3 9。)再假定寄存器 B中的值为 B C D码的9 4 h。如果执行指令:
MOV A, 27 h
MOV B, 94 h
ADD A,
B
累加器中的值将为 BB h ,当然,它不是B C D码,因为B C D码中的每一块不能超过 9。但是,
现在执行指令:
DAA
则累加器中的值为 2 1 h,且CF = 1,这是因为 2 7和9 4的十进制和为 1 2 1。如果想进行 B C D
码的算术运算,这样做是相当方便的。
经常需要对一个数进行加 1或减1操作。在第 1 7章的乘法程序中,我们需要对一个数减 1,
使用的方法是加上 FFh ,它是 - 1的2的补码。 8 0 8 0中包含特殊的用于寄存器或存储单元的加 1
指令(称作增量)和减 1指令(称作减量):
操作码
指令
0 4
0 C
1 4
1 C
2 4
2 C
3 4
3 C
操作码
INR B
INR C
INR D
INR E
INR H
INR L
INR [HL]
INR A
指令
0 5
0 D
1 5
1 D
2 5
2 D
3 5
3 D
DCR B
DCR C
DCR D
DCR E
DCR H
DCR L
DCR [HL]
DCR A
单字节指令 I N R和D C R可影响除C F外的所有标志位。
8 0 8 0也包含4个循环移位指令,这些指令可使累加器中的内容左移或右移 1位:
操作码
0 7
0 F
1 7
1 F
指令
R L C
R R C
R A L
R A R
含义
累加器循环左移
累加器循环右移
累加器带进位循环左移
累加器带进位循环右移
这些指令只影响 C F。
假定累加器中的值为 A 7 h,即二进制的 1 0 1 0 0 111。R L C指令使A中的内容向左移位,最高
位(移出顶端)成为最低位(移进底端),同时决定进位标志位 C F的状态。其结果为 0 1 0 0 1111
且CF = 1。R R C指令用同样的方法向右移位。开始为 1 0 1 0 0 111,执行R R C指令后,其结果为第
19章 两种典型的微处理器
下载
197
11 0 1 0 0 11且CF = 1。
R A L和R A R指令有些不同。当向左移位时, R A L指令把C F移入累加器的最低位,而把最
高位移入 C F中。例如,如果累加器的内容为 1 0 1 0 0 111,CF = 0,R A L指令执行的结果是累加
器的内容变为 0 1 0 0 111 0,且CF = 1 。同样,在相同的初始条件下, R A R指令使累加器的内容
变为0 1 0 1 0 0 11,CF = 1。
对于乘2(左移1位)和除2(右移一位)操作,移位指令非常方便。
把微处理器寻址的存储器叫作随机访问存储器( R A M)是有原因的:微处理器可以简单
地根据提供的地址访问某一存储位置。 R A M就像一本书一样,我们可以打开它的任何一页。
它并不像做在微缩胶片上的一个星期的报纸,要找到周六版,需扫过大半周。同样,它也不
同于磁带,要播放磁带上的最后一首歌需快进整个一面。微缩胶片和磁带的存储不是随机访
问的,而是顺序访问的。
R A M确实效果不错,对于微处理器来说更是如此。但在使用存储器时有所差别是有好处
的,下面就是一种既非随机又非顺序访问的存储方式:假定你在一个办公室里,人们到你桌
前给你分配工作,每个工作都需要某种文件夹。通常你会发现你在继续某项工作之前,必须
使用另外一个文件夹先做一些相关的工作。因此你把第一个文件夹放在桌子上,又拿出第二
个文件夹放在它上面进行工作。现在又有一个人来让你做一个优先权高于前面工作的工作,
你拿来一个新文件夹放在那两个上面继续工作。而此项工作又需要另外一个文件夹,这样在
你的桌子上很快就摆了一堆文件夹了。
注意,这个堆非常明确地、有序地保存了你正在做的工作的轨迹。最上面的文件夹总是
最高优先权的工作,去掉这个以后,下一个肯定是你就要做的,如此类推。当你最终去掉了
桌子上的最后一个文件夹后(你开始的第 1项工作),你就可以回家了。
以这种方式工作的存储器技术叫做作堆栈( s t a c k)。从底向上压入堆栈,从顶向下弹出堆
栈,因此这也叫后进先出存储器,或 L I F O。最后放入堆栈中的数据最先被取出,最先放入堆
栈中的数据最后被取出。
计算机中也可以使用堆栈,不是用来保存工作而是用来存储数据,且已被证明使用起来
非常方便。向堆栈中放入数据叫作 p u s h(压入),从堆栈中取走数据叫作 p o p(弹出)。
假定你正在用汇编语言设计程序,程序中使用了寄存器 A、B和C。但在编程过程中,你
发现此程序需要去做另一件事 — 一个小的计算,其中也要使用寄存器 A,、B、C。而你最终
要回到先前的程序,并使用 A、B、C中原有的值。
当然,你能做的工作只是简单地把寄存器 A、B、C中的值保存到存储器中的不同位置,
以后再把这些位置的值装载到寄存器中,但这样做需要保存值被保存的位置。一个显然的方
法是把寄存器压入堆栈:
PUSH A
PUSH B
PUSH C
一会儿再解释这些指令的作用。现在,我们只需要知道它们以某种方式把寄存器的内容
保存在一个后进先出的存储器中。一旦这些语句执行了,你的程序就可以毫无顾虑地利用这
些寄存器来做其他工作。为了得到原来的值,只需简单地按与压入堆栈相反的顺序把它们从
堆栈中弹出即可,如下所示:198
POP C
POP B
POP A
编码的奥秘
下载
记住是后进先出。如果用错了 P O P语句的顺序,就会引起错误。
堆栈机制的一个好处在于一个程序的不同部分都可以使用堆栈而不会出现问题。例如,
在把A、B、C压入堆栈中后,程序的其他部分还可能需要把寄存器 C、D、E的内容压入堆栈:
PUSH C
PUSH D
PUSH E
接着,这一部分程序所要做的就是在第一部分弹出 C、B和A之前,用下述方法恢复寄存
器的值:
POP E
POP D
POP C
堆栈是怎样实现的呢?首先,堆栈只是不被别的东西使用的正常的 R A M的一部分。 8 0 8 0
微处理器包含一个特殊的 1 6位寄存器来对这一部分存储器进行寻址,这个 1 6位寄存器叫作堆
栈指针。
这里举的压入和弹出寄存器的例子对于 8 0 8 0来说不太准确。 8 0 8 0的P U S H指令实际上是存
储1 6位的值到堆栈, P O P指令用来恢复它们。因此 8 0 8 0不用像 PUSH C 和POP C 这样的指令,
它有下述8条指令:
操作码
C 5
D 5
E 5
F 5
指令
PUSH
PUSH
PUSH
PUSH
操作码
BC
DE
HL
PSW
C 1
D 1
E 1
F 1
指令
POP
POP
POP
POP
BC
DE
HL
PSW
PUSH BC指令把寄存器B和C的内容保存到堆栈中, POP BC指令恢复它们。最后一行的
缩写P S W指的是程序状态字,前面讲过,它是包含有标志位的 8位寄存器。最后一行的两条指
令实际上是把累加器和 P S W都压入和弹出堆栈。如果你想保存所有寄存器和标志位的内容,
可以使用:
PUSH PSW
PUSH BC
PUSH DE
PUSH HL
当以后想恢复这些寄存器的内容时,按相反的顺序使用 P O P指令:
POP HL
POP DE
POP BC
POP PSW
堆栈是怎样工作的呢?假设堆栈指针为 8 0 0 0 h,PUSH BC指令将引起下面这些情况发生:
• 堆栈指针减 1至7 F F F H
• 寄存器B的内容保存在堆栈指针所指的地址处,即 7 F F F h处第19章 两种典型的微处理器
下载
199
• 堆栈指针减 1至7 F F E H
• 寄存器C的内容保存在堆栈指针所指的地址处,即 7 F F E h处
当堆栈指针仍然为 7 F F E h时,POP BC指令执行,用来反向执行每一步:
• 从堆栈指针所指的地址(即 7 F F E h)处装载数据到寄存器 C中
• 堆栈指针增 1至7 F F F h
• 从堆栈指针所指的地址(即 7 F F F h)处装载数据到寄存器 B中
• 堆栈指针增 1至8 0 0 0 h
对每个 P U S H指令,堆栈都会增加 2个字节,这可能导致程序出现小毛病 — 堆栈可能会
变得很大以致会覆盖掉程序所需的一些代码和数据。这就是堆栈上溢问题。同样,过多的
P O P指令会过早用光堆栈内容,这就是堆栈下溢问题。
如果8 0 8 0同一个6 4 K B的存储器连接,你可能想把初始堆栈指针置为 0 0 0 0 h。第一条 P U S H
指令使地址减 1变为F F F F h,这时堆栈占用了存储器的最高地址。如果你的程序放在从 0 0 0 0 h
处开始的存储器区域,则它和堆栈离的就太远了。
对堆栈寄存器进行赋值的指令是 L X I,即load extended immediate(装载扩展的立即数)。

下面这些操作码后的指令也是把两个字节装载到 1 6位寄存器:
操作码
0 1
11
2 1 指令
LXI BC,x x x x
LXI DE,x x x x
LXI HL,x x x x
3 1 LXI SP,x x x x
指令:
LXI
BC,527Ah
等价于
MVI B,52
MVI C,7A h
L X I指令保存一个字节。另外,上表中最后一条 L X I指令用来对堆栈指针赋值。微处理器
复位后,这条指令并不常用来作为首先执行的指令之一:
0000 h:
LXI
SP,0000 h
也可以对寄存器对和堆栈指针执行加 1和减1操作,就好像它们是 1 6位寄存器一样:
操作码
0 3
1 3
2 3
3 3
指令
INX
INX
INX
INX
BC
DE
HL
SP
操作码
0 B
1 B
2 B
3 B
指令
DCX
DCX
DCX
DCX
BC
DE
HL
SP
即然是在讨论 1 6位指令,可以看看更多一些这样的指令。下面的指令是把 1 6位寄存器对
的内容加到寄存器对 H L中:
操作码 指令
0 9 DAD HL,B C
1 9 DAD HL,D E
2 9 DAD HL,H L
3 9 DAD HL,S P200
编码的奥秘
下载
上面这些指令可节约几个字节。例如,第一条指令正常需要 6个字节:
MOV
A,L
ADD A,C
MOV L,A
MOV A,H
ADC A,B
MOV H,A
D A D指令通常用于计算存储器地址,这条指令只影响 C F。
下一步让我们看以下各种指令。下面的两个操作码后都紧跟着一个 2字节地址,分别保存
和装载寄存器对 H L的内容:
操作码
指令 含义
2 h SHLD [aaaa],H L 直接保存H L
2 A h LHLD HL,[ a a a a ] 直接装载H L
寄存器L的内容保存在地址 a a a a处,寄存器 H的内容保存在地址 a a a a + 1处。
下面两条指令用来从寄存器对 H L中装载程序计数器 P C或堆栈指针 S P:
操作码
指令
含义
E 9 h PCHL PC,H L 把 H L中的内容装载到 P C
F 9 h SPHL SP,H L 把H L中的内容装载到 S P
P C H L指令实际上是一种转移指令, 8 0 8 0执行的下一条指令保存在 H L寄存器对中的地址
所对应的存储单元中。 S P H L是另外一个设置 S P的方法。
下面两条指令中,第一条指令使 H L的内容与堆栈中最上面的两个字节进行交换,第二条
指令使H L的内容与寄存器对 D E的内容进行交换:
操作码
指令
含义
E 3 h XTHL HL,[ S P ] H L与堆栈顶端的内容交换
E B h XCHG HL,D E DE 和H L交换
除了P C H L外,还没有讲过 8 0 8 0的转移指令。前面第 1 7章中讲过,处理器中有一个叫作程
序计数器 P C的寄存器, P C中包含处理器取回并执行的指令的存储器地址。通常 P C使处理器顺
序执行存储器中的指令,但有些指令 — 通常命名为 J u m p(转移)、B r a n c h(分支)或 g o t o
(跳转) — 能使处理器偏离这个固定的过程。这些指令使得 P C装载另外的值,处理器所取的
下一条指令将在存储器的其他位置。
尽管简单、普通的转移指令很有用,但条件转移指令更有用。这些指令可使处理器根据
某些标志,如 C F或Z F,来转移到另外的地址处。条件转移指令的存在使得第 1 7章中的自动加
法机成为一般意义上的数字计算机。
8 0 8 0有5个标志位,其中 4个对条件转移指令有用处。 8 0 8 0支持9种不同的转移指令,包括
无条件转移指令和基于 Z F、C F、P F、S F是1还是0的条件转移指令。
在介绍这些指令之前,先介绍一下与此相关的另外两种指令。第一个是 C a l l(调用)指令。
C a l l指令与 J u m p指令的不同之处在于:前者把一个新值装入到程序计数器 P C中,处理器保存
P C中原来的地址,保存在哪里?当然,在堆栈中。
这种策略意味着 C a l l指令可有效地保存“程序从哪里跳转”的标记。处理器最终可利用此第19章 两种典型的微处理器
下载
201
地址返回到原来的位置。这个返回指令叫 R e t u r n。R e t u r n指令从堆栈中弹出两个字节,并把该
值装载到P C中。
C a l l和R e t u r n指令是任何处理器中都很重要的功能。它们允许程序员编写子程序,子程序
是程序中经常用到的代码段。(“经常”一般意味着“不止一次”。)子程序是汇编语言中的基
本组成部分。
让我们看一个例子。假设你正在编写一个汇编语言程序,并且需要使两个数相乘,因此
你可以写出一段代码来做这项工作,然后继续往下编写程序,现在又需要使两个数相乘。因
为你已知道如何进行两数相乘,因此你只需简单地重复使用同样的指令来完成它。但只是简
单地两次把这些指令输入到存储器吗?希望不是,这是对时间和存储空间的浪费,更好的方
法是转送到原来的代码处。由于无法返回到程序的当前位置,所以一般的 J u m p指令不能用。
但使用C a l l和R e t u r n指令可以让你完成所需的功能。
进行两数相乘的一组指令可以作为一个子程序。下面就是这样的子程序。在第
1 7章中,
被乘数(和结果)存放在存储器的某一地址中;而在 8 0 8 0子程序中,寄存器 B的值和寄存器 C
中的值相乘,然后把 1 6位乘积装入寄存器 H L中:
Multiply:
PUSH PSW
PUSH BC
SUB H,H
SUB L,L
MOV A,B
CPI A,00h
JZ AllDone
;保存要改变的寄存器
;设置HL(结果)为0000h
;乘数送到A
;如果为0,结束
MVI B,00h ;BC的高字节置0
Multloop: DAD
DEC
JNZ HL,BC
A
Multloop ;BC 加到HL
;乘数减1
;不为0,转移
AllDone: POP
POP
RET BC
PSW ;恢复保存的寄存器
;返回
注意,上述子程序的第 1行开始有一个标号 M u l t i p l y。当然,这个标号对应于子程序所在
的存储器地址。子程序开始用了两个 P U S H指令,通常在子程序开始处应先保存(以后恢复)
它需要使用的寄存器。
然后该子程序把 H和L寄存器置为 0。虽然可以使用 M V I指令而不用 S U B指令,但那需要使
用4个字节的指令而不是2个字节的指令。子程序执行完后,寄存器对 H L中保存有相乘的结果。
下一步该子程序把寄存器 B的内容(乘数)移入 A中,并且检查它是否为 0。如果它为 0,
乘法子程序到此结束,因为结果为 0。由于寄存器 H和L已经为0,因而子程序可以只使用 J Z指
令跳转到末端的两个 P O P指令处。
否则,子程序把寄存器 B置为0。现在,寄存器对 B C中包含一个 1 6位的被乘数, A中为乘
数。D A D指令把B C(被乘数)加到 H L(结果)中。 A中的乘数减 1,且只要它不为 0,J N Z指
令就又使 B C加到 H L中。此小循环继续下去,直到 B C加到 H L中的次数等于乘数。(可以用
8 0 8 0的移位指令编写一个更有效的乘法子程序。)202
编码的奥秘
下载
利用这个子程序完成 2 5 h与1 2 h相乘的程序用下面的代码:
MOV B,
MOV C,
CALL
25h
12h
Multiply
C a l l指令把P C的值保存在堆栈中,该值是 C a l l指令的下一条指令的地址。然后, C a l l指令
使程序转移到标号 M u l t i p l y所标识的指令,即子程序的开始。当子程序计算完结果后,执行
R E T(返回)指令,即从堆栈中弹出程序计数器的值,程序继续执行 C a l l指令后面的语句。
8 0 8 0指令集中包括条件 C A L L指令和条件 R e t u r n指令,但它们远不如条件转移指令用得多。
下表中完整地列出了这些指令:
条件
操作码
指令
操作码
指令
操作码
指令
你可能知道,存储器并不是唯一连接在微处理器上的设备。一个计算机系统通常需要输
入输出设备以便于实现人机通信。输入输出设备通常包括键盘和显示器。
微处理器是怎样与外围设备 (对于连接到微处理器而不是存储器的东西的称呼 )进行通信的
呢?外围设备具有与存储器相似的接口,微处理器可通过对应于外设的具体地址来对外设进
行读写。在有些微处理器中,外围设备实际上占用了通常用来寻址存储器的地址,这种配置
叫作内存映像 I / O。然而在 8 0 8 0中,在 65 536 个正常地址外还有 2 5 6个附加地址专门为输入输
出设备预留,这些就是 I / O端口(I/O Port)。I / O地址信号为 A 0 ~A 7 ,但I / O访问与存储器访问
不同,由8 2 2 8系统控制芯片锁存的信号来区分。
O U T指令用于把累加器中的数据写到紧跟该指令的字节所寻址的 I / O端口中。 I N指令把端
口的数据读入到累加器中。
操作码 指令
D 3 OUT PP
D B IN
PP
外围设备有时需要引起微处理器的注意。例如,当你在键盘上按键时,如果微处理器能
马上知道这件事通常是有帮助的。这由称作 中断 (i n t e r r u p t)的机制来完成,这是连接至第19章 两种典型的微处理器
下载
203
8 0 8 0 I N T输入端的,由外设产生的信号。
然而,当8 0 8 0复位时,它不能对中断产生响应。程序必须通过执行 E I(Enable interrupts)
指令来允许中断,通过执行 D I(Disable Interrupts)指令来禁止中断。
操作码 指令
F 3
F B D I
E I
8 0 8 0的I N T E输出端信号表明允许中断。当外设需要中断微处理器当前工作时,它把 8 0 8 0
的I N T输入端设置为 1。8 0 8 0通过从存储器中取出指令对它作出响应,但控制信号表明有中断
发生。外设通常通过提供下述指令之一来响应 8 0 8 0:
操作码
C 7
C F
C 7
D F
指令
RST
RST
RST
RST
操作码
0
1
2
3
E 7
E F
E 7
F F
指令
RST
RST
RST
RST
4
5
6
7
以上称作 R e s t a r t指令,它们与 C A L L指令相似,也需要把当前程序计数器的值压入堆栈。
但R e s t a r t指令随后转移到一个特定的位置: RST 0 转移到地址 0000h 处, RST 1 转移到地址
0 0 0 8 h处等等,直到 RST 7转移到地址 0 0 3 8 h处。位于这些地址中的代码段来处理中断。例如,
来自键盘的中断引起 RST 4指令执行,地址 0 0 2 0 h处的一些代码从键盘读取数据(这将在第 2 1
章做全面介绍)。
到此为止,已讲述了 2 4 3个操作码。下述 1 2个字节与任何操作码无关: 0 8 h、1 0 h、1 8 h、
2 0 h、2 8 h、3 0 h、3 8 h、C B h、D 9 h、D D h、E D h和F D h。这样总共有 2 5 5个操作码。下面还要
提到一个操作码:
操作码
0 0
指令
N O P
N O P代表 no op,即no operation (无操作)。N O P指令使微处理器什么都不做。这有什
么作用吗?用于填空。 8 0 8 0通常可以执行一批 N O P指令而不会有任何坏情况发生。
以下不打算再详细讨论 Motorola 6800 ,因为它的设计与功能与 8 0 8 0非常相似。下面是
6 8 0 0的4 0个管脚:204
编码的奥秘
下载
V S S 代表接地, V C C 是5 V电源。与 8 0 8 0相似, 6 8 0 0有1 6个地址输出信号和既可作为输入又
-
-
可作为输出的 8个数据信号。它有 R E S E T信号和R / W信号。 I R Q信号代表中断请求 。6 8 0 0的
时钟信号比8 0 8 0的更加简单。 6 8 0 0没有I / O端口的概念,所有输入输出设备都必须是 6 8 0 0存储
器地址空间的一部分。
6 8 0 0有一个1 6位程序计数器 P C、一个1 6位堆栈指针 S P、一个8位状态寄存器(作为标志)
以及两个 8位累加器 A和B。它们都被看成是累加器( B不是只作为一个寄存器)是因为没有能
用A来做而不能用B来做的事。 6 8 0 0没有附加的 8位寄存器。
6 8 0 0中有一个 1 6位索引寄存器( index register),可用来保存一个 1 6位地址,很像 8 0 8 0中
的寄存器对 H L。对于许多指令来说,它们的地址都可以由索引寄存器和紧跟在操作码后的地
址之和得到。
虽然 6 8 0 0和8 0 8 0所实现的操作相同 — 装载、保存、加法、减法、移位、转移、调用,
但很明显的区别是:它们的操作码和助记符完全不同。例如,下面是 6 8 0 0的分支转移指令:
操作码 指令
2 0 h
2 2 h
2 3 h
2 4 h
2 5 h
2 6 h
2 7 h
2 8 h
2 9 h
2 A h
2 B h
2 C h
2 D h
2 E h
2 F h B R A
B H I
B L S
B C C
B C S
B N E
B E Q
B V C
B V S
B P L
B M I
B G E
B LT
B G T
B L E
含义
转移
大于则转移
小于或相同则转移
进位为0则转移
进位置1则转移
不等则转移
相等则转移
溢出为0则转移
溢出置1则转移
为正则转移
为负则转移
大于或等于 0则转移
小于0则转移
大于0则转移
小于或等于 0则转移
6 8 0 0没有像 8 0 8 0中那样的奇偶标志位 P F,但它有一个 8 0 8 0中没有的标志位 — 溢出标志
位(overflow flag)。上述转移指令中有些依赖于标志位的组合。
当然8 0 8 0和6 8 0 0指令集是不同的,这两个芯片是同一时间由不同的两个公司的两组不同
的工程师设计的。这种不兼容性意味着每一种芯片不能执行对方的机器代码,为一种芯片开
发的汇编语言程序也不能翻译成可在另一种芯片上执行的操作码。编写可在多于一种处理器
上执行的计算机程序是第 2 4章的主题。
8 0 8 0和6 8 0 0还有一个有趣的不同点:在两种微处理器中, L D A指令都是从一个特定的地
址处装载到累加器。例如,在 8 0 8 0中,下列字节序列:
8080LDA指令第19章 两种典型的微处理器
下载
205
将把存储在地址 3 4 7 B h处的字节装载到累加器。现在把上述指令与 6 8 0 0的L D A指令相比
较,后者采用称作 6 8 0 0的扩展地址模式:
6800LDA指令
该字节序列把存储在地址 7B34h 处的字节装载到累加器 A中。
这种不同点是很微妙的。当然,你也可能认为它们的操作码不同:对 8 0 8 0来说是3 A h,对
6 8 0 0来说是 B 6 h。但主要是这两种微处理器处理紧随操作码后的地址是不同的, 8 0 8 0认为低
位在前,高位在后; 6 8 0 0则认为高位在前,低位在后。
这种 I n t e l和M o t o r o l a微处理器保存多字节数时的根本不同从没有得到解决。直到现在,
I n t e l微处理器在保存多字节数时,仍是最低有效字节在前(即在最低存储地址处);而
M o t o r o l a微处理器在保存多字节数时,仍是最高有效字节在前。
这两种方法分别叫作 l i t t l e - e n d i a n ( I n t e l方式)和big-endian (Motorola方式)。辩论这两种方
式的优劣可能是很有趣的,不过在此之前,要知道术语 b i g - e n d i a n来自于 Jonathan Swift 的
《G u l l i v e r’s Tr a v e l s》,指的是 Lilliput 和B l e f u s c u在每次吃鸡蛋前都要互相碰一下。这种辩论
可能是无目的的。先不说哪种方法在本质上说是不是正确的,但这种差别的确当在基于 l i t t l e -
endian 和b i g - e n d i a n机器的系统之间共享信息时会带来附加的兼容性问题。
这两种微处理器后来怎样了呢? 8 0 8 0用在一些人所谓的第一台个人计算机上,不过可能
更准确的说法是第一台家用计算机上。下图是 Altair 8800 ,出现在 1 9 7 5年1月份的《 P o p u l a r
E l e c t r o n i c s》杂志的封面上。
当你看到 Altair 8800 时,前面面板上的灯泡和开关看起来似乎很熟悉。这和第 1 6章为
64KB RAM阵列建议的初始“控制面板”的界面是同一类型的。
8 0 8 0之后出现了 Intel 8085,更具意义的是出现了 Z i l o g制造的 Z - 8 0芯片。 Z i l o g是Intel 公
司的竞争对手,是由 I n t e l公司的前雇员,也曾在 4 0 0 4芯片上做出重要贡献的 Federico Faggin206
编码的奥秘
下载
建立的。 Z - 8 0与8 0 8 0完全兼容,且增加了许多很有用的指令。 1 9 7 7年,Z - 8 0用于Radio Shack
TRS-80 Model1上。
也是在1 9 7 7年,由Steven Jobs 和Stephen Wo z n i a k建立的苹果计算机公司推出了 APPLE II。
APPLE II 既不用 8 0 8 0也不用 6 8 0 0,而是使用了采用 M O S技术的更便宜的 6 5 0 2芯片,它是对
6 8 0 0的增强。
1 9 7 8年6月,I n t e l公司推出了 8 0 8 6,一个 1 6位微处理器,它可访问的存储空间达到 1 M B。
8 0 8 6的操作码与 8 0 8 0不兼容,但它包含乘法和除法指令。一年后, I n t e l公司又推出了 8 0 8 8,
其内部结构与 8 0 8 6相同,但其外部按字节访问存储器,因此该微处理器可使用较流行的为
8 0 8 0设计的8位支持芯片。I B M在其5 1 5 0个人计算机 — 通常叫作IBM PC — 上使用了8 0 8 8芯
片,这种个人计算机在 1 9 8 1年秋季推出。
I B M进军P C市场产生了巨大影响,许多公司都发布了与 P C兼容的机器(兼容的含义在随
后各章里将要详细讨论)。多年来,“IBM PC兼容机”也暗指“Intel inside”,特指所谓x 8 6家
族的I n t e l微处理器。Intel x86家族继续发展,1 9 8 5年出现了3 2位的3 8 6芯片,1 9 8 9年出现了4 8 6
芯片。1 9 9 3年初,出现了 Intel Pentium微处理器,普遍地用在 P C兼容机上。虽然这些 I n t e l微处
理器都不断增加了指令的指令集,但它们仍然支持从 8 0 8 6开始的所有以前处理器的操作码。
苹果公司的 Macintosh 首次发布于 1 9 8 4年,它使用了Motorola 68000 — 一个1 6位的微处
理器,也即 6 8 0 0的下一代处理器。 6 8 0 0 0和它的后代(常称为 6 8 K系列)是制造出的最受欢迎
的一类微处理器。
从1 9 9 4年开始, M a c i n t o s h计算机开始使用 Power PC, 一种由M o t o r o l a、I B M和A p p l e公司
联合开发的微处理器。 P o w e r P C是由一种称作 R I S C(精简指令集计算机)的微处理器体系结
构来设计的,它试图通过简化某些方面以提高处理器的速度。在 R I S C计算机中,每条指令通
常长度相同,(在P o w e r P C中为3 2位),存储器访问只限于装载和保存指令,且指令做简单操
作而不是复杂操作。 RISC 处理器通常有大量的寄存器以避免频繁访问存储器。
因为P o w e r P C具有完全不同的指令集,所以它不能执行 6 8 K的代码。但现在用于 A P P L E
M a c i n t o s h的 PowerPC 微处理器可仿真 6 8 K。运行于PowerPC 上的仿真程序逐个检验 6 8 K程序
的每一个操作码,并执行适当的操作。仿真程序不如 P o w e r P C自身代码那样快,但可以工作。
按照摩尔定律,微处理器中的晶体管数量应该每 1 8个月翻一番。这些多增加的晶体管有
什么用处呢?
有些晶体管用于增加处理器的数据宽度,从 4位到8位到1 6位再到3 2位;另外一些增加的晶
体管用于处理新的指令。现在大多数微处理器都有用于浮点算术运算的指令(这将在第 2 3章解
释);还有一些新增加的指令用来进行一些重复计算,以便在计算机屏幕上显示图片和电影。
现代处理器使用了一些技术用来提高速度,其中之一是流水线技术,处理器在执行一条
指令的同时读取下一条指令。由于转移指令会改变执行流程,实际上这样达不到预期效果。
现在的处理器还包含一个 Cache( 高速缓冲存储器 ),它是做在处理器内部的快速 R A M阵列,
用于保存最近执行的指令。因为计算机程序经常执行一些小的指令循环,因而 C a c h e可以避免
这些指令重复装载。所有这些速度提升措施都需要在处理器中有更多的逻辑器件和晶体管。
如前所述,微处理器只是完整的计算机系统的一部分(尽管是最重要的部分)。我们将在第2 1章构造这样一个系统,但首先必须学习怎样编码存在存储器中的除了操作码和数字外的
其他东西。我们必须返回到小学一年级,再学习一下怎样读写文本。下载



1<词>,2[句],3/段\,4{节},5(章)。
2016-2-9 10:12
查看资料  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] [3] [4] [5] [6] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: