利用空档期时间学习一下计算机系统基础,以前对这些知识只停留在应试层面,今天终于能详细理解一下了。参考课程为南京大学袁春风老师的计算机系统基础MOOC,参考书籍也是袁老师的教材,这是我的听课+自查资料整理后的笔记

W2-1十进制数与二进制数,各进制数直接的转换

“转换”的概念在数据表示中的反映

【计算机专业漫谈】【计算机系统基础学习笔记】W2-1十进制数与二进制数,各进制数直接的转换-LMLPHP
右侧是上一章节介绍的计算机系统的层次结构,表示要计算机解决的应用问题可以用算法来实现,算法由高级语言编写程序来实现,程序需要转换成一条条指令才能在微体系结构上运行。
对应的应用问题处理的对象是一些感觉媒体(比如:游戏的动画和声音,播放的视频,处理的图形、图像和文本),为了能够让计算机能够处理这些感觉媒体,最终要将其变成二进制0/1序列,在处理之前,要用算法和数据结构描述这些感觉媒体,在数据结构当中是数值和编码,在程序中,可以用int, float等来声明其为什么类型。
在指令层面,我们看到的数据是一串0/1序列,这样的指令在计算机中执行时,要么在ALU中进行运算,要么在总线上进行传输,它们是通过逻辑门电路实现,最终得到一位一位的信息。
因此,计算机在处理数据时,从上往下是具体的实现过程,从下往上是抽象概括的过程。
上述过程还可归纳为下图:
【计算机专业漫谈】【计算机系统基础学习笔记】W2-1十进制数与二进制数,各进制数直接的转换-LMLPHP
整数在机器中是用定点数表示,实数用浮点数表示

信息的二进制编码

为什么要用二进制编码

计算机内部处理的所有数据必须是“数字化编码”了的数据。在计算机系统内部,所有信息都是用二进制进行编码的,也就是说计算机内部采用的是二进制表示方式。其原因简述如下:

  • 二进制只有两个基本状态,使用两个稳定状态的物理器件就可以表示二进制数的每一位,比如高电位代表1,低电位代表0,或者用脉冲的有无和脉冲的正负形都可以很可靠地表示“0”和“1”.
  • 二进制的编码、计算和运算规则都很简单,可用开关电路实现,简便易行。
  • 两个符号“1”和“0”正好与逻辑命题的两个值“真”和“假”相对应,为计算机中实现逻辑运算和程序中的逻辑判断提供了便利的调剂。

机器级数据分为两大类

指令所处理的数据类型分为数值数据非数值数据两种。

  • 数值数据:数值数据可用来表示数量的多少,可比较其大小,分为整数实数,整数又分为无符号整数和带符号整数。在计算机内部,整数用定点数表示,实数用浮点数表示
  • 非数值数据:非数值数据就是一个没有大小之分的位串,不表示数量的多少,主要用来表示字符数据(西文字符和汉字)和逻辑数据(逻辑数(包括位串))。

真值和机器数

  • 机器数:用0和1编码的计算机内部的0/1序列
  • 真值:真正的值,即:现实中带正负号的数

【例】unsigned short(无符号短整型)变量x的真值是127,其机器数是多少?
【答】 127 = 2 7 − 1 127=2^{7}-1 127=271,其机器数为为0000 0000 0111 1111

数值数据的表示

1、数值数据表示的三要素:

  • 进位计数制
  • 定、浮点表示
  • 如何用二进制编码

即:要确定一个数值数据的值必须先确定这三个要素。

2、进位计数制

  • 十进制、二进制、十六进制、八进制数及其相互转换

3、定/浮点表示(解决小数点问题)

  • 定点整数、定点小数
  • 浮点数(可用一个定点小数和一个定点整数来表示)

4、定点数的编码(解决正负号问题)

  • 原码、补码、反码、移码

进位计数制

十进制(Decimal)计数制

十进制数,每个数位可用十个不同符号0,1,2,…,9来表示,每个符号处在十进制数中不同位置时,所代表的数值不一样。
【例】2585.62代表的值是:
2585.62 = 2 × 1 0 3 + 5 × 1 0 2 + 8 × 1 0 1 + 5 × 1 0 0 + 6 × 1 0 − 1 + 2 × 1 0 − 2 2585.62=2\times10^{3}+5\times10^{2}+8\times10^{1}+5\times10^{0}+6\times10^{-1}+2\times10^{-2} 2585.62=2×103+5×102+8×101+5×100+6×101+2×102
一般地,任意一个十进制数 D = d n d n − 1 . . . d 1 d 0 . d − 1 d − 2 . . . d − m , ( m , n 为正整数 ) D=d_{n}d_{n-1}...d_{1}d_{0}.d_{-1}d_{-2}...d_{-m},(m,n为正整数) D=dndn1...d1d0.d1d2...dm,(m,n为正整数)
其值可表示为如下形式:
V ( D ) = d n × 1 0 n + d n − 1 × 1 0 n − 1 + . . . + d 1 × 1 0 1 + d 0 × 1 0 0 + d − 1 × 1 0 − 1 + d − 2 × 1 0 − 2 + . . . + d − m × 1 0 − m ,其中, d i ( i = n , n − 1 , . . . , 1 , 0 , − 1 , − 2 , . . . , − m ) 可以是 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 这 19 个数字符号中的任何一个 V(D)=d_{n}\times10^{n}+d_{n-1}\times10^{n-1}+...+d_{1}\times10^{1}+d_{0}\times10^{0}+d_{-1}\times10^{-1}+d_{-2}\times10^{-2}+...+d_{-m}\times10^{-m},其中,d_{i}(i=n,n-1,...,1,0,-1,-2,...,-m)可以是0,1,2,3,4,5,6,7,8,9这19个数字符号中的任何一个 V(D)=dn×10n+dn1×10n1+...+d1×101+d0×100+d1×101+d2×102+...+dm×10m,其中,di(i=n,n1,...,1,0,1,2,...,m)可以是0,1,2,3,4,5,6,7,8,919个数字符号中的任何一个

其中,“10”称为基数(base),它代表每个数位上可以使用的不同数字符号个数。 1 0 i 10^{i} 10i称为第 i i i位上的权。运算时,“逢十进一”。

二进制(Binary)计数制

二进制数,每个数位可用两个不同符号0和1来表示,每个符号处在不同位置时,所代表的数值不一样。
【例】100101.01代表的值是:
( 100101.01 ) 2 = 1 × 2 5 + 0 × 2 0 + 0 × 2 3 + 1 × 2 2 + 0 × 2 1 + 1 × 2 0 + 0 × 2 − 1 + 1 × 2 − 2 = 37.25 (100101.01)_{2}=1\times2^{5}+0\times2^{0}+0\times2^{3}+1\times2^{2}+0\times2^{1}+1\times2^{0}+0\times2^{-1}+1\times2^{-2}=37.25 (100101.01)2=1×25+0×20+0×23+1×22+0×21+1×20+0×21+1×22=37.25
【注】R进制数应该用括号把数字括起来,并在右下角标注角标R,即 ( X X X ) R (XXX)_{R} (XXX)R(十进制标不标注均可),或者采用后缀形式,比如二进制数就加后缀B代表二进制数,如01011010B.
一般地,任意一个二进制数
B = b n b n − 1 . . . b 1 b 0 . b − 1 b − 2 . . . b − m , ( m , n 为正整数 ) B=b_{n}b_{n-1}...b_{1}b_{0}.b_{-1}b_{-2}...b_{-m},(m,n为正整数) B=bnbn1...b1b0.b1b2...bm(m,n为正整数)
其值可表示为如下形式:
V ( B ) = b n × 2 n + b n − 1 × 2 n − 1 + . . . + b 1 × 2 1 + b 0 × 2 0 + b − 1 × 2 − 1 + b − 2 × 2 − 2 + . . . + b − m × 2 − m , 其中 , b i ( i = n , n − 1 , . . . , 1 , 0 , − 1 , − 2 , . . . − m ) 可以是 0 或 1 V(B)=b_{n}\times2^{n}+b_{n-1}\times2^{n-1}+...+b_{1}\times2^{1}+b_{0}\times2^{0}+b_{-1}\times2^{-1}+b_{-2}\times2^{-2}+...+b_{-m}\times2^{-m},其中,b_{i}(i=n, n-1, ..., 1, 0, -1, -2, ... -m)可以是0或1 V(B)=bn×2n+bn1×2n1+...+b1×21+b0×20+b1×21+b2×22+...+bm×2m,其中,bi(i=n,n1,...,1,0,1,2,...m)可以是01
“2”称为基数(base),它代表每个数位上可以使用的不同数字符号个数。 2 i 2^{i} 2i称为第 i i i位上的权,运算时,“逢二进一”。
【注】二进制数,横着写,左侧为高位,右侧为低位,比如1000 0001,其中最左侧的1是高位,左右侧的1是低位,这是一个相对的位置概念。二进制数从右往左(小数点之前)分别是第0位……第n位,其他数制的高低位也是如此。

R进位计数制

R进制数字系统中,应采用R个基本符号(0,1, 2,…,R-1)表示各位上的数字,采用“逢R进一”的运算规则,对于每一个数位i,该位上的权为 R i R^{i} Ri。R被称为该数字系统的基。

  • 二进制:R=2,基本符号位0和1
  • 八进制:R=8,基本符号为0,1,2,3,4,5,6,7( 2 3 = 8 2^{3}=8 23=8,对应3位二进制)
  • 十六进制:R=16,基本符号0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F( 2 4 = 16 2^{4}=16 24=16,对应4位二进制)
  • 十进制:R=10,,基本符号为0,1,2,3,4,5,6,7,8,9

下表列出了二进制、八进制、十进制和十六进制这4种进位计数制中各基本数之间的对应关系:

八进制和十六进制

日常生活中用十进制表示数值,计算机中用二进制表示所有信息,那为什么还要引入 八进制 / 十六进制呢?八进制 / 十六进制是二进制的简便表示。便于阅读和书写。它们之间对应简单,转换容易。在机器内部用二进制表示,在屏幕或其他设备上表示时,转换为八进制/十六进制数,可缩短长度

  • 八进制:Octal (用后缀“O”表示)
  • 十六进制:Hexadecimal (用后缀“H”,或前缀“0x”表示)

【例】1010 1100 0100 0101 0001 0000 1000 1101B可写成十六进制0xAC45108D 或 AC45108DH
或写成八进制数(每3位一换,从后向前换,最后补0),先把二进制切分成每3位分割一换,从后向前换:
(加粗打斜的是补的0)
010 101 100 010 001 010 001 000 010 001 101B
所以转换成八进制为:25421210215O

十进制数与R进制数之间的转换

R进制数转十进制数

按“权”展开:

  • 【例1】 ( 10101.01 ) 2 = 1 × 2 4 + 1 × 2 2 + 1 × 2 0 + 1 × 2 − 2 = ( 21.25 ) 10 (10101.01)_{2}=1\times2^{4}+1\times2^{2}+1\times2^{0}+1\times2^{-2}=(21.25)_{10} (10101.01)2=1×24+1×22+1×20+1×22=(21.25)10
  • 【例2】 ( 307.6 ) 8 = 3 × 8 2 + 7 × 8 0 + 6 × 8 − 1 = ( 199.75 ) 10 (307.6)_{8}=3\times8^{2}+7\times8^{0}+6\times8^{-1}=(199.75)_{10} (307.6)8=3×82+7×80+6×81=(199.75)10
  • 【例3】 ( 3 A . 1 ) 8 = 3 × 1 6 1 + 10 × 1 6 0 + 1 × 1 6 − 1 = ( 58.0625 ) 10 (3A.1)_{8}=3\times16^{1}+10\times16^{0}+1\times16^{-1}=(58.0625)_{10} (3A.1)8=3×161+10×160+1×161=(58.0625)10

十进制数转二进制数

先将十进制转二进制,如果需要,再将二进制转换为16或8进制,整数部分和小数部分分别转换:
① 整数----“除基取余,上右下左”
【注】整数部分的转换方法是“除基取余,上右下左”。也就是说,用要转换的十进制整数去除以基数R,将得到的余数作为结果数据中各位的数字,直到上商为0为止。上面的余数(先得到的余数)作为右边低位上的数位,下面的余数作为左边高位上的数位。
② 小数----“乘基取整,上左下右”
【注】小数部分的转换方法是“乘基取整,上左下右”。也就是说,用要转换的十进制小数去乘以基数R,将得到的乘积的整数部分作为结果数据中各位的数字,小数部分继续与基数R相乘。以此类推,直到某一步乘积的小数部分为0或已得到希望的位数为止。最后,将上面的整数部分作为左边高位上的数位,下面的整数部分作为右边低位上的数位。
在转换过程中,可能乘积的小数部分总得不到0,即转换得到希望的位数后还有余数,这种情况下得到的是近似值。

实际上,记住1、2、4、8、16、32、64、128、256、512、1024、2048、4096、8192…(分别对应2的0次方,1次方,2次方……), 就可以简单进行整数部分的转换

【例1】 ( 835.6875 ) 10 = ( 1101000011.1011 ) 2 (835.6875)_{10}=(11 0100 0011.1011)_{2} (835.6875)10=(1101000011.1011)2
【解】(1)整数----“除基取余,上右下左”
【计算机专业漫谈】【计算机系统基础学习笔记】W2-1十进制数与二进制数,各进制数直接的转换-LMLPHP
(2)小数----“乘基取整,上左下右”
【计算机专业漫谈】【计算机系统基础学习笔记】W2-1十进制数与二进制数,各进制数直接的转换-LMLPHP
故结果为结果为 11 0100 0011.1011B
【简便方法】整数部分:835=512+256+64+2+1,整数部分结果为11 0100 0011B,小数部分:0.6875=0.5+0.125+0.0625,小数部分结果为 0.1011B,故结果为11 0100 0011.1011B
【提示】835先用和它最近的2的多少次方的数去减,比如 2 9 = 512 < 835 < 2 10 = 1024 , 所以 835 − 512 = 323 2^{9}=512<835<2^{10}=1024,所以835-512=323 29=512<835<210=1024,所以835512=323,所以第一个含1的二进制高位是第9位(从0开始,有第0位)
然后 2 8 = 256 < 323 < 2 9 = 512 , 323 − 256 = 67 2^{8}=256<323<2^{9}=512,323-256=67 28=256<323<29=512,323256=67,所以第二个含1的二进制位是第8位
2 6 = 64 < 67 < 2 7 = 128 , 67 − 64 = 3 2^{6}=64<67<2^{7}=128,67-64=3 26=64<67<27=128,6764=3,所以第三个含1的二进制位是第6位
2 1 = 2 < 3 < 2 2 = 4 , 3 − 2 = 1 2^{1}=2<3<2^{2}=4,3-2=1 21=2<3<22=4,32=1,所以第四个含1的二进制位是第1位
2 0 = 1 2^{0}=1 20=1,所以第五个含1的二进制位是第0位
故整数部分为11 0100 0011B,然后看小数部分
2 − 1 = 0.5 < 0.6875 , 0.6875 − 0.5 = 0.1875 2^{-1}=0.5<0.6875,0.6875-0.5=0.1875 21=0.5<0.68750.68750.5=0.1875,所以第一个含1的二进制位是第-1位
2 − 3 = 0.125 < 0.1875 , 0.1875 − 0.125 = 0.0625 2^{-3}=0.125<0.1875,0.1875-0.125=0.0625 23=0.125<0.18750.18750.125=0.0625,所以第二个含1的二进制位是第-3位
2 − 4 = 0.0625 2^{-4}=0.0625 24=0.0625,所以第三个含1的二进制位是第-4位
故小数部分为0.1011B
所以结果为11 0100 0011.1011B

十进制数与八进制数之间的转换

【例】 ( 835.63 ) 10 = ( 1503.50243 … ) 8 (835.63)_{10}=(1503.50243…)_{8} (835.63)10=(1503.50243)8
【解】(1)整数----“除基取余,上右下左”
【计算机专业漫谈】【计算机系统基础学习笔记】W2-1十进制数与二进制数,各进制数直接的转换-LMLPHP
(2)小数----“乘基取整,上左下右”
【计算机专业漫谈】【计算机系统基础学习笔记】W2-1十进制数与二进制数,各进制数直接的转换-LMLPHP
可能小数部分总得不到0,此时得到一个近似值,现实中的精确值可能在机器内部无法用0和1精确表示。

八进制数转换为二进制数

八进制数转换成二进制数的方法很简单,只要把每一个八进制数字改写成等值的3位二进制数即可,且保持高低位的次序不变。八进制数字与二进制数的对应关系如下:
( 0 ) 8 = 000 (0)_{8}=000 (0)8=000
( 1 ) 8 = 001 (1)_{8}=001 (1)8=001
( 2 ) 8 = 010 (2)_{8}=010 (2)8=010
( 3 ) 8 = 011 (3)_{8}=011 (3)8=011
( 4 ) 8 = 100 (4)_{8}=100 (4)8=100
( 5 ) 8 = 101 (5)_{8}=101 (5)8=101
( 6 ) 8 = 110 (6)_{8}=110 (6)8=110
( 7 ) 8 = 111 (7)_{8}=111 (7)8=111
【例】将 ( 13.724 ) 8 (13.724)_{8} (13.724)8转换成二进制数
【解】 ( 13.724 ) 8 = ( 001   011.   111   010   100 ) 2 = ( 1011.10101 ) 2 (13.724)_{8}=(001\space011.\space111\space010\space100)_{2}=(1011. 10101)_{2} (13.724)8=(001 011. 111 010 100)2=(1011.10101)2

十六进制数转换为二进制数

十六进制数转换成二进制数的方法与八进制数转换成二进制数的方法类似,只要把每一个十六进制数字改写成等值的4位二进制数即可,且保持高低位的次序不变。十六进制数字与二进制数的对应关系如下:
( 0 ) 16 = 0000 (0)_{16}=0000 (0)16=0000
( 1 ) 16 = 0001 (1)_{16}=0001 (1)16=0001
( 2 ) 16 = 0010 (2)_{16}=0010 (2)16=0010
( 3 ) 16 = 0011 (3)_{16}=0011 (3)16=0011
( 4 ) 16 = 0100 (4)_{16}=0100 (4)16=0100
( 5 ) 16 = 0101 (5)_{16}=0101 (5)16=0101
( 6 ) 16 = 0110 (6)_{16}=0110 (6)16=0110
( 7 ) 16 = 0111 (7)_{16}=0111 (7)16=0111
( 8 ) 16 = 1000 (8)_{16}=1000 (8)16=1000
( 9 ) 16 = 1001 (9)_{16}=1001 (9)16=1001
( A ) 16 = 1010 (A)_{16}=1010 (A)16=1010
( B ) 16 = 1011 (B)_{16}=1011 (B)16=1011
( C ) 16 = 1100 (C)_{16}=1100 (C)16=1100
( D ) 16 = 1101 (D)_{16}=1101 (D)16=1101
( E ) 16 = 1110 (E)_{16}=1110 (E)16=1110
( F ) 16 = 1111 (F)_{16}=1111 (F)16=1111
【例】将 ( 2 B . 5 E ) 16 (2B.5E)_{16} (2B.5E)16转换成二进制数
【解】 ( 2 B . 5 E ) 16 = ( 0010   1011.   0101   1110 ) 2 = ( 101011.0101111 ) 2 (2B.5E)_{16}=(0010\space1011.\space0101\space1110)_{2}=(101011.0101111)_{2} (2B.5E)16=(0010 1011. 0101 1110)2=(101011.0101111)2

二进制数转换为八进制数

二进制数转换成八进制数时,整数部分从低位向高位方向每3位用一个等值的八进制数来替换,最后不足3位时在高位补0凑满3位;小数部分从高位向低位方向每3位用一个等值的八进制数来替换,最后不足3位时在低位补0凑满3位。例如:

  • ( 0.10101 ) 2 = ( 000.   101   010 ) 2 = ( 0.52 ) 8 (0.10101)_{2}= ( 000.\space101\space010)_{2}= (0.52)_{8} (0.10101)2=(000. 101 010)2=(0.52)8
  • ( 10011.01 ) 2 = ( 010   011.   010 ) 2 = ( 23.2 ) 8 (10011.01)_{2}= (010 \space011.\space010)_{2}= ( 23.2)_{8} (10011.01)2=(010 011. 010)2=(23.2)8

二进制数转换为十六进制数

二进制数转换成十六进制数时,整数部分从低位向高位方向每4位用一个等值的十六进制数来替换,最后不足4位时在高位补0凑满4位;小数部分从高位向低位方向每4位用一个等值的十六进制数来替换,最后不足4位时在低位补0凑满4位。例如:
( 11001.11 ) 2 = ( 0001   1001.   1100 ) 2 = ( 19. C ) 16 ( 11001.11)_{2}= (0001\space1001.\space1100 )_{2}= ( 19.C)_{16} (11001.11)2=(0001 1001. 1100)2=(19.C)16

定点数和浮点数

计算机中只能通过约定小数点的位置来表示数值数据中的小数点。
1、定点数:小数点位置约定在固定位置的数称为定点数。定点小数用来表示浮点数的尾数部分,定点整数用来表示整数,分带符号整数无符号整数
2、浮点数:小数点位置约定为可浮动的数称为浮点数。对于任意一个实数 X X X,可以表示成如下形式: X = ( − 1 ) s × M × R e X=(-1)^{s}\times M\times R^{e} X=(1)s×M×Re,其中,S取值为0或1,S取0时X为正数,S取1时X为负数,M是一个二进制定点小数,称为数X的尾数(mantissa),E是一个二进制定点整数,称为数X的指数(exponent);R是基数(radix、base)),可以为2、4和16等。计算机中只要表示S、M和E三个信息,就能确定X的值,这称为浮点数。其结构如下:
【计算机专业漫谈】【计算机系统基础学习笔记】W2-1十进制数与二进制数,各进制数直接的转换-LMLPHP
在基数R一定的情况下,尾数M的位数反映数X的有效位数,它决定了数的表示精度,有效位数越多,表示精度就越高;阶E的位数决定数X的表示范围;阶E的值确定了小数点的位置。浮点数的表示范围比定点数范围要大得多。

【结论】要解决数值数据的表示问题,只要解决定点数的编码问题。

05-02 10:27