13015 计算机系统原理 第二章 数据的表示和运算

1,674 阅读10分钟

记录学习自考课程编码13015学习过程,献给每一位拥有梦想的"带专人"

ps:有不正确的地方麻烦更新在评论区,我会一一修复 😅

第二章 数据的表示和运算

信息的二进制编码

在计算机内部,所有信息都用二进制数字表示。这是因为:

  1. 二进制只有两种基本状态,而使用有两个稳定状态的物理器件可以容易地表示二进制数的每一位
  2. 二进制的编码、计数和运算规则都很简单,可用开关电路实现,简便易行
  3. 两个符号10正好与逻辑命题的两个值相对应,为计算机中实现逻辑运算和程序中的逻辑判断提供了便利的条件,特别是能通过逻辑门电路方便地实现算数运算

指令所处理的基本数据类型分为两种:数值数据和非数值数据

  1. 数值数据可用来表示数量的多少,可比较其大小,分为整数和实数
  2. 整数又分为无符号整数和带符号整数。在计算机内部,整数用定点数表示,实数用浮点数表示
  3. 非数值数据没有大小之分,不表示数量的多少,主要包括字符数据和逻辑数据

表示一个数值数据要确定的三个要素:

  1. 进位记数制
  2. 定/浮点表示
  3. 编码规则

任何给定一个二进制 0/1 序列,在未确定它采用什么进位记数制、定点还是浮点表示以及编码表示方法之前,它所代表的数值数据的值是无法确定的

日常生活中,常使用带正负号的十进制数表示数值数据。例如6.18,-127等。但是,在计算机内部,数值数据通常用二进制数表示。如果采用十进制数表示数值数据的话,也要将十进制数编码成二进制数,即采用二进制编码的十进制数(BCD)

进位计数制

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

一般采用 B 表示二进制,O 表示八进制,D 表示十进制,H 表示十六进制,也可以在十六进制之前用 0X 做前缀

R 进制转换为十进制数:

将二进制数(10101.01)2 = (1×24+0×23+1×22+0×21+1×20+0×21+1×221 \times 2^4 + 0 \times 2^3 + 1\times 2^{2} + 0 \times 2^1 + 1 \times 2^0 + 0 \times 2^{-1} + 1 \times 2^{-2})10 = (21.25)10

一个数的负数次方计算方式 计算该数正数次方的倒数

xn=1xnx^{-n} = \frac{1}{x^n}

十进制小数转化R进制:

将小数部分与基数 R 做乘法运算,把乘积中的整数部分取出作为对应进制的高位,剩余小数部分继续与基数 R 做乘法运算,直到小数部分为 0

8 或 16 进制转换二进制:

对 8 进制进行一位展开为三位,16 进制一位展开为四位,小数部分按同样规则展开

定点数的编码表示

原码:是一种用于表示有符号数的编码方法。在这种表示方法中,最高位(最左边的一位)被用作符号位,其值为 0 表示正数,为 1 表示负数。其余的位数被用来表示数值的绝对值(即数的大小)

+5 的原码表示为 00000101(假设使用 8 位表示)

+18 的原码表示为 00010010(假设使用 8 位表示)

−5 的原码表示为 10000101(假设使用 8 位表示)

−18 的原码表示为 10010010(假设使用 8 位表示)

优点:

  1. 直观,方便

缺点:

  1. 存在两个表示零的编码:+0 表示为 00000000 和 −0 表示为 10000000。这在计算和表示上会导致一些不便。
  2. 加减法实现复杂

补码表示法:

的概念:对于 n 位二进制数 那么该二进制数的就是 2^n^

  1. 正数的补码是自身:[XT]=XT=M+XT(modM)[X_T]_补 = X_T = M + X_T(mod {\kern 5pt} M)

例如 XT = 5;M = 10

[5]=5=10+5(modM)[5]_补 = 5 = 10 + 5(mod {\kern 5pt} M)

5 = 15 % 10

  1. 负数的补码是模与该数绝对值的差:[XT]=M=XT=M+XT(modM)[X_T]_补 = M = |X_T| = M + X_T(mod {\kern 5pt} M)

  2. 无论正负数 它的补码都是 加这个数

    [XT]=M+XT(modM)[X_T]_补 = M + X_T(mod {\kern 5pt} M)

  3. 补码的区间为 [2n1,2n1)[-2^{n-1},2^{n-1}) 其中 -2^n-1^可以取到 2^n-1^无法取到

    如果 n = 8 则是 -2^7^到 2^7^-1 -128 - 127

  4. 0 的补码:[+0]=[0]=2n±0=100=000(mod2n)[+0]_补 = [-0]_补 = 2^n \pm 0 = 10…0 = 00…0(mod {\kern 5pt} 2^n)

    0 的二进制 00000000 取反后得到 11111111

    加 1 11111111 加 1 后得到 00000000因为 8 位全1 加 1 后会溢出,结果回到 0

  5. -1的补码:[1]=2n1=111(n1)[-1]_补 = 2^n -1 = 11…1(n 个 1)

    绝对值二进制表示:1 的二进制表示 00000001

    取反 11111110加 1 得到 11111111

    例题:

    当补码位数分别为 n 位、n+1 位时,求-2^n-1^的补码

    [XT]=M+XT(modm)[X_T]_补 = M + X_T(mod {\kern 5pt} m)

    n: [2n1]=2n+(2n1)=2n2n1=2n1=100000000n0(mod2n)[-2^{n-1}]_补 = 2^n + (-2^{n-1}) = 2^n - 2^{n-1} = 2^{n-1} = 100000000 (n个 0)(mod {\kern 5pt} 2^n)

    n+1:[2n1]=2n+1+(2n1)=2n+12n1=2n+2n1=1100(n10)(mod2n+1)[-2^{n-1}]_补 = 2^{n+1} + (-2^{n-1}) = 2^{n+1} - 2^{n-1} = 2^n + 2^{n-1} = 110…0(n-1个 0)(mod {\kern 5pt} 2^{n+1})

    2n+12n1=2n+2n12^{n+1} - 2^{n-1} = 2^{n} + 2^{n-1}推导过程:

    2n+1=2n1×21×21=2n1+1+1=2n+12^{n+1} = 2^{n-1} \times 2^1 \times 2^1 = 2^{n-1+1+1} = 2^{n+1}

    2n1×21×212n12^{n-1} \times 2^1 \times 2^1 - 2^{n-1}

    4×2n12n14 \times 2^{n-1} - 2^{n-1}

    =3×2n1 = 3 \times 2^{n-1}

    =(2+1)2n1= (2+1)2^{n-1}

    =21×2n1+2n1=2^1 \times 2^{n-1} + 2^{n-1}

    =2n+2n12^n + 2^{n-1}

    例题:

    设补码位数为 8,求 1101100 和 -1101100 的补码

    [XT]=M+XTmodM[X_T]_补 = M + X_T(mod {\kern 5pt} M)

    [110110]=28+1101100=01101100(mod28)[110110]_补 = 2^8 + 110 1100 = 0110 1100(mod {\kern 5pt} 2^8)

    [1101100]=281101100=10010100(mod28)[-1101100]_补 = 2^8 - 1101100 = 10010100(mod {\kern 5pt} 2^8)

    由于不够 8 位所以前面补 0 01101100 取反 10010011 然后加 1 10010100

    简便方法:

    XT是正的,XT的补码就是他自身

    XT是负的,符号位写 1,数值部分取反,末位+1

    例题:

    已知[XT]=1011 0100,求真值 XT

    1011 0100 -1 = -100 1100

image.png

image.png

二进制减法规则:借 1 当 2,由于第一位减1 不够减所以向第二位借,第二位为 0 无法借向第三位借,第三位为 1 可以借,借给第二位此时第二位变为 2,第二位借给第一位 1,第二位变为 1 第一位变为 2 所以 2-1 = 1 1-0 = 1

例题:

已知[XT] = 1 011 0100,求[-XT]

已知补码,先减1 1 011 0011 得到真值的反码,取反 1 100 1100得到真值,求该真值取负的补码,符号位由负的变为正的 0 100 1100

补码的优点

  1. 0 的表示是唯一的
  2. 用加法实现减法,加减法统一
  3. 比源码和反码可以多表示一个最小负数
  4. 不需要通过循环进位来调整结果

整数的表示

IEEE 754 计数标准

符号 + 阶码 + 尾数

  1. 16 位半精度:1+5+10 偏移量 15
  2. 32 位单精度:1+8+23 偏移量 127
  3. 64 为双精度:1+11+52 偏移量 1023

指数(阶码)决定了范围,尾数决定了精度

浮点数表示的计算步骤

  1. 分解成符号、指数、尾数三部分
  2. 符号:0 正、1 负
  3. 把十进制转换成二进制
  4. 写成科学计数法
  5. 指数偏移
  6. 记录尾数
  7. 写成计算机中的浮点数表示

例题:

把十进制数 10.25 转换成单精度浮点数表示

  1. 符号是正号
  2. (10)10 = (1010)2 (0.25)10 = (0.01)2
  3. (10.25)10 = (1010.01)2
  4. 1.01001×231.01001 \times 2^3 01001 尾数 3 为指数参与计算指数偏移
  5. 3 + 127 = 130 得到指数偏移 转换为二进制 10000010 得到阶码
  6. 合并符号、阶码、尾数 10.25 为正数 0 10000010(如果不足 8 位前面补 0 补到八位)01001 (不足 23 位补 0 补满)

例题:

把十进制数-0.75转换为单精度浮点数表示

  1. 符号是负号 所以用 1 来表示
  2. (0)10 = (0)2 (0.75)10 = (11)2
  3. (0.75)10 = (0.11)2
  4. 1.1×211.1 \times 2^{-1} 1 尾数 -1 为指数参与计算指数偏移
  5. -1 + 127 = 126 得到指数偏移 转换为二进制 01111110 得到阶码
  6. 合并符号、阶码、尾数 -0.75 为负数 1 01111110 1(后面 22 个 0)

例题:

求机器数为 C0A0 0000H 的 IEEE 754 单精度浮点数值

首先将十六进制转换为二进制

1 100 0000 1 010 0000 0000 0000 0000 0000

可以得到符号位(1 位)为 1 可知该数为负数

指数位(8 位) (100 0000 1)2 = (129)10

尾数位(10 位) (010 0000 0000 0000 0000 0000)2

组合计算:

  1. 该数为负数
  2. 129 - 127 = 2 得到指数(如果计算浮点数表示 阶码 = 127 + 指数 如果计算浮点数值 阶 = 指数 - 127)(32 位单精度格式其基数隐含为 2)所以表示 2^2^
  3. 尾数用源码表示,第一位总为 1,因而可在尾数中默认第一位的 1,称为隐藏位,使得单精度格式的 23 位尾数实际上表示了 24位有效数字,双精度格式的 52 位尾数实际上表示了 53 位有效数字。IEEE 754 规定 隐藏位 1的位置在小数点之前
    1. 尾数 (1.01)2 因为后面全为 0 所以无效,转换为 10 进制0.25
    2. 1×20+0×21+1×221 \times 2^0 + 0 \times 2^{-1} + 1 \times 2^{-2}
    3. 1+0+122=1.251 + 0 + \frac{1}{2^{-2}} = 1.25
  4. 1.25×22=5.01.25 \times 2^2 = 5.0
  5. 根据符号位可以得到该数为负数 所以 -5.0

数值类型转换

  1. 溢出
    1. 表示范围
    2. 可能引发的问题:极大/小值、符号错误、无穷大值
  2. 舍入
    1. 表示精度
    2. 接近真实值但不完全相同

C 语言的数值类型转换

  1. int、float、double
  2. int、float \rightarrow double 无问题
  3. double \rightarrow float 溢出、舍入
  4. double \rightarrow int 溢出 舍入
  5. float \rightarrow int 溢出 舍入
  6. int \rightarrow float 不会溢出 舍入

例题:

判断下列表达式的真值情况

  1. i == (int)(float) i 可能会发生舍入
  2. f == (float)(int) f 可能会发生溢出
  3. i == (int)(double) i 没有问题
  4. f == (float)(double) f 没有问题
  5. d == (float) d 可能发生溢出
  6. f == -(f) 没有问题
  7. (d+f)-d == f d + f 会发生类型转换变为双精度,不会与单精度相等

数据宽度和单位

  1. 比特:位 (元)b 组成二进制信息最小单位
  2. 字节:Byte
  3. 子: 子的长度对于不同指令集架构是不同的
  4. 字长:CPU 一次可以处理多少位数据,还影响系统总线的宽度,或寻址的能力

数据存储和排列顺序

  1. 最低有效字节(LSB)
  2. 最高有效字节(MSB)
  3. 大端
  4. 小端
  5. 0000 0000 左边高位 MSB | 0000 0000 |0000 0000 | 0000 0101 右边低位 LSB

image.png

捏捏捏捏捏捏捏捏捏捏捏

搭配 B 站萝卜Bro 的课程观看效果更佳 计算机系统原理13015 萝卜哥直播精讲 第03课:数据表示 真零基础 萝卜哥自考