《计算机组成原理》Alan Clements 第二章 计算机算

本文深入探讨了计算机内部数据的基本表示方法,包括位、字、字节的概念,以及二进制补码系统的运作原理。文章详细解释了字符编码、图像、声音的数字化表示,有损与无损编码的区别,以及二进制算术运算,如加法、减法、乘法和除法的实现。此外,还介绍了浮点数的IEEE754标准和规格化浮点数的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基础知识

  • 位(bit、比特):计算机内存储和处理信息的最小单位,值只能为0或1,不可再细分
  • 字:一组或一串比特
  • 字节(byte):8个二进制位

根据计算机厂商不同,有以下商用术语

  • 字(word):16位
  • 长字:32位
    或者
  • 字(word):32位
  • 半字:16位

重要概念

  • 表示范围:一个数能表示的最大值和最小值之间的值
  • 精度:数据表现得多好得衡量标准
  • 准确度:测量值为51.32,实际值为51.34,则准确度为0.02
  • 误差:真实值-测量值

字符编码

  • 计算机都是面向字节的
  • ASCII码(7位):
    • 前32位不可打印,用于完成回车、退格、换行等
    • 剩余96个字符可打印
  • ISO 8859-1拉丁编码(8位)
  • Unicode编码(16位):
    • 前256个字符被映射到ASCII字符集
    • 这是Java字符的标准方法

图像、声音和视觉

  • 像素:8位(单色)或24位(三基)
    所以可以看到某些软件颜色表示为
    #000000 代表黑色
    #FFFFFF 代表白色
    以上为十六进制数,6位16进制即24位2进制
    
  • 精确编码(数据):存储和处理都不会丢失信息,称为无损的
  • 有损编码(图片和声音):如MPEG、JPEG、MP3,编码会造成不可逆的质量损失

有符号整数


符号及值表示法

第一个0代表正数,1代表负数,后面7位是值
0 0001101=+13
1 0001101=-13
  • 缺点
    ①0 0000000和1 0000000都代表0
    ②加法用加法器,减法用减法器

二进制补码运算(微处理器使用二进制补码系统表示有符号整数)

  • 补数:一个数和它的补数之和为一个常数,如一个4位二进制数可以表示0000–1111之间的数,即十进制0–15(共16个值),那么16就是这个常数,3的补数是13
  • 二进制求补数:各位取反加1,如1011(11),各位取反0100,加1,即0101(5),原理如下
    • 如果一个n位二进制数N,其补数为2n-N
    • 假设n=4,则2n-N=8-N,8-N用二进制表示为10000-N
    • 10000-N=10000-1-N+1=1111-N+1
    • 此时对于N,如果有N=5,则表示为0101,1111-0101=1010,即1111-N的结果就是N的各位取反
    • 最后再+1
    • 该算法特别适合用硬件实现!

减法:
  • 用二进制补码表示时,A-B可以看成A加上B的补数
    0111(7)-0101(5)
    可以看成 7 加上 5 的补数
    0101(5)的补数为1011(11)
    
  • 注意!虽然0101(5)的补数为1011(11),但是在计算时,必须将1011看成“补码表示”,即1011代表-5,而不是11
    0111(7)+1011(-5)=2
    

运算溢出:
  • 两个正数合为负数,两个负数和为正数,即操作数A、B符号相同,但结果符号与它们不同时,则发生了运算溢出

移位运算:
  • 左移,空出的最低为补0,移出的最高位保存在“进位标识”中
  • 右移,空出的最高位补符号位,移出的最低位保存在“进位标识”中
  • 进位标识:计算机的一个存储单元

左移:左移一位等价于该数乘以2
右移:左移一位等价于该数除以2

0011(3)左移一位0110(6)
1101(-3)左移一位1011(-6)
0110(6)右移一位0011(3)
1011(-6)右移一位1101(-3)

当一个数左移或者右移时,如果超出表示范围时,则运算溢出,如

0000~1111表示-8~+7,如果是
0101(5),左移翻倍,则应该是10,已经超出-8~+7的范围,所以会有
0101(5)左移一位1010(-6),而不是预期结果10,负数同理
1010(-6),左移范围,应该是-12,超出范围,有
1010(-6)左移一位0100(4),而非预期的-12

无符号二进制乘法
  • 算法一:要求计算机存储n个部分积,然后将他们累加

    两个n位二进制数相乘会得到一个2n位的积
            1 0 1 0(10)
    X       1 1 0 1(13)
    ————————————————
            1 0 1 0
          0 0 0 0
        1 0 1 0
      1 0 1 0
    ————————————————
    1 0 0 0 0 0 1 0 (130)
    
  • 算法二:每得到一个部分积就做一次加法

  • 计算机实际应用多种方法加快运算(如:构造专门的逻辑阵列直接得到两数的积)

有符号二进制乘法

算法一:矫正因子(矫正因子的存在使得该算法变慢

  1. 假设正数X与负数-Y相乘,结果为-XY
  2. 二进制补码表示X,仍是X
  3. 二进制补码表示-Y,Y的补数(2n-Y)用二进制补码表示是它的相反数-Y,所以-Y的二进制补码表示为2n-Y
  4. 则有X和-Y相乘的二进制补码表示X·(2n-Y)=2nX-XY,而理论值应该是22n-XY,所以需要矫正因子使得2nX-XY+矫正因子=22n-XY
  5. 所以矫正因子为2n(2n-X)

算法二:布斯乘法

  1. 两个二进制数的乘法存在以下规律,比如M • 58

    58=32+16+8+2(25+24+23+21

  2. 然后又可以根据次方的连续性分为几部分

    543是一组,即25+24+23
    1自己为一组,即21

  3. 对各部分进行变型

    21=22-21第一部分
    25+24+23=26-23第二部分

  4. 因此有M • 58=M •(25+24+23+21)=M •(26-23+22-21

  • 此时再让我们看下布斯乘法的原则
    ①当前位为1,下一位为0,则部分积减去被乘数
    M • 00111010
    -M • 21
    ②当前位和下一位现同,什么都不做
    ③当前位为0,下一位为1,则部分积加上被乘数
    M • 00111010
    +M • 22

  • 当①②③条原则相结合,会发现,他们实际上是圈起来一个次方连续性的一部分,上述圈起来的是
    M • 00111010
    而该部分可以被表示为-M • 21+M • 22=M •(22-21),发现这不就是第一部分吗!

  • 继续执行原则
    ①当前位为1,下一位为0,则部分积减去被乘数
    M • 00111010
    -M • 23
    ②当前位和下一位现同,什么都不做
    M • 00111010
    M • 00111010
    ③当前位为0,下一位为1,则部分积加上被乘数
    M • 00111010
    +M • 26

  • 同理,被圈起来的是
    M • 00111010
    而上述被圈起来的部分可以被表示为-M • 23+M • 26=M •(26-23),这就是第二部分

算法三:用加法代替,比如

  • 10P=2 • (2 • 2 • P+P):即左移两次,加P,再左移一次
  • 9P=2 • 2 • 2 • P+P:即左移三次,加P

除法


浮点数

概念

  • 浮点数:顾名思义,小数点位置不固定
  • 组成:①数值;②小数点在数值中的位置
  • 二进制浮点数表示:尾数 • 2指数

IEEE754浮点数标准

①32位单精度浮点数
②64位双精度浮点数
③128位四精度浮点数

规格化浮点数

①最高位总是1

1.101010......
1.001001......

②所有位数都是有效的

规格化:1.0101001,所有位都有效
非规格化:0.000101001,前四位无效

③充分利用了可用的最大精度

2~2~


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值