第二章:数据表示与运算

一、数制与编码

1. 进位计数制及其转换

(1)采用二进制编码的原因

  • 二进制只有两种状态,使用物理器件制作成本低(2018)
  • “1”与“0”正好与逻辑中的真假对应,方便实现逻辑运算(2018)
  • 二进制的编码和运算简单,方便实现算术运算(2018)

(2)不同进制间的相互转换

  • 二进制转换为八进制

    • 从小数点开始向左向右每隔3位为一组
  • 二进制转换为十六进制

    • 从小数点开始向左向右每隔4位为一组
  • 十进制转换为二进制(不直接考但会间接用到)

    • 整数部分:除基取余法
    • 小数部分:乘基取整法

(3)真值与机器数

  • 真值

    • 用正负号表示的数值为真值,最真实的数值
  • 机器数

    • 用“0”和“1”表示正负的数值为机器数,机器中使用的数

2. BCD码

  • 2022版考纲删除此部分

3. 定点数的编码表示

机器数的定点表示

image

表示法定义
原码最高位表示数的符号,其余位表示数值
补码正数的补码是本身,负数的补码是符号位不变,其它各位取反后末位+1
反码正数的反码是本身,负数的反码是符号位不变,其它各位取反
移码只能表示整数,把补码的符号位取反便是移码,方便比较大小

(假设字长n+1位) image

image

4. 整数的表示

(1)无符号整数

  • 无符号整数常用来表示内存地址
  • 无符号数和带符号数相互转换,存储的数值不变,只是解释方式变了(2019)
  • 表达式中存在无符号数和有符号数时,所有数都转换为无符号数类型(数值不变,解释方法变了)
  • unsigned int 比 int所表示的正数的范围广,经常考察int溢出而unsigned int 不溢出的情况
  • 四则运算
    • 无符号数加法:X+Y=X+Y然后左边溢出的位数都扔掉
    • 无符号数减法:X-Y=X+【-Y】补
    • 乘除法:简单的移位运算,有些数据该丢掉就丢掉
  • 无符号数-1=11111111
  • 编程通常用a>b,而不用a-b>0(可能发生类型转换而出错)

(2)带符号整数

  • 计算机中的带符号整数都用补码表示

二、运算方法和运算电路

1. 运算电路

(1)标志寄存器

标志位名称描述
溢出标志位(OF)有符号数运算的结果发生溢出则为1(只针对有符号数)(2018)
进位标志位(CF)无符号数运算向更高位进位或借位则为1(只针对无符号数)(2018)
零标志位(ZF)执行结果为0则为1
符号标志位(SF)执行结果为负则为1(只针对有符号数)
奇偶标志位(PF)执行结果最低八位中1的个数为偶数个则为1
调整标志位(AF)运算时最低半字节有进位或借位则为1

这些标志位是CPU状态寄存器的一部分,它们在执行算术和逻辑运算后由CPU自动设置,用于指示特定的运算结果状态,从而影响程序的执行流程,例如在条件分支指令中根据这些标志位的状态决定是否跳转。

(2)算数逻辑单元

image

(3)加法器

①一位全加器

image

②串行加法器

image

③并行加法器

  • 串行进位的并行加法器 image

  • 并行进位的并行加法器 image

④补码加减运算器 image

  • 注意
    • 无符号数加减法、补码加减法都可通过此电路实现
    • Sub信号加法为0,减法为1
    • CF=Sub异或Cout(2018)

2. 运算方法

(1)移位运算

  • 算术移位(2018) image

  • 逻辑移位(2018)

    • 带上符号位一起移位(无论左移还是右移都补0)
  • 循环移位

    • 分类
      • 不带进位位CF
        • 类似逻辑移位,CF不参与其中,但移位产生的副本会送进CF
      • 带进位位CF

注意指向CF的箭头 image

(2)加减运算

  • 溢出判断
    • 一位符号位
      • 符号位和最高数位,同时进位不进位或同时不进位不溢出,否则溢出(2010、2014、2018)
    • 双符号位
      • 特点
        • 具有模2补码全部优点且更易检查加减运算中的溢出问题(不能解决溢出问题)
        • 存储时只需要存一个符号位,只在ALU中运算时采用双符号位
      • 结论
        • 00:正数无溢出
        • 11,负数无溢出
        • 01,结果正溢出
        • 10,结果负溢出

(3)乘除运算

  • 乘法
乘法类型描述
原码一位乘累加次数n,右移次数n,符号位不参与运算
补码一位乘累加次数n+1,右移次数n,符号位参与运算

在原码一位乘中,由于符号位不参与运算,所以需要额外的步骤来处理符号位,以确保结果的正确性。而在补码一位乘中,符号位的处理更加自然,因为它可以像其他位一样参与运算,这使得补码在计算机中的运算更加普遍。

  • 除法
运算方法描述
原码加减交替法加减次数n+1或n+2,左移次数n,符号位不参与运算
原码恢复余数法
补码加减交替法加减次数n+1,左移次数n,符号位参与运算

(4)类型转换

类型描述
无符号数<–>有符号数数字不变,只不过解释方法变了(2012、2016、2019)
长–>短低位留着,高位截断
短–>长即符号扩展,数值不会发生变化

例子:

  • char(1B)–>short(2B)–>int(4B)–>long(4B)–>float(4B)–>double(8B)
  • 215=32768;216=65536(2012、2016默认记住)
  • int–>float可能影响精度(int数值在2^24范围内,float能精确表示,超过后可能不能精确表示)
  • float–>int可能影响精度(比如float含小数时转换过程中小数部分丢失),也可能会溢出(float表示范围远大于int)
  • int–>double一定不会出现精度丢失
  • undesignd(无符号数):在运算时按照int型运算,在读取时按照无符号数

(5)符号扩展

  • 正数
    • 都是添0
  • 负数
    • 原码:添0
    • 反码:添1
    • 补码:整数添1;小数添0(2009)

(6)数据存储和排列

①基本概念

  • 对于一个数:10 23 45H
    • LSB(最低有效字节):45
    • MSB(最高有效字节):10

②存储方式

存储方式描述
大端方式数据从高位到低位存储(符合习惯)(2020)
小端方式数据从低位到高位存储(反人类法)(经常考)

image

③边界对齐方式(2012、2020)

  • 32位计算机按字编址,1字等于4B
  • 字节随意存,半字地址是2整数倍,字地址是4整数倍,双字地址是8整数倍

image

三、浮点数表示与运算

1. 浮点数的表示

(1)浮点数的表示格式 image image

(2)浮点数的表示范围

  • 正上溢和负上溢都是上溢,正下溢和负下溢都是下溢 image
  • 尾数决定精度,阶码决定范围

(3)浮点数的规格化

  • 目的

    • 使尾数的有效数位尽可能多,从而提高运算的精度
  • 途径

    • 左归(尾数左移);右归(尾数右移)
表示法规格化方式
基为2原码规格化:0.1……/1.1……(尾数最高位一定是1)
补码规格化:0.1……/1.0……(尾数最高位和尾数符号位相反)
基为4、8原码规格化:尾数最高两位或三位不全为0
阶码基为8,则表示的真值为8^(二进制阶码的真值)

(4)IEEE754标准

①图示

经常考察把存储的二进制数转换为真值(2011、2014、2020) image

②尾数M

  • 采用原码表示,且隐藏了最高位的1.

③阶码E

  • 采用移码表示,即减去127或者1023
  • 短浮点数阶码的表示范围为-126~127

④表示范围

  • 规格化浮点数

计算表示的最值(最大正负数、最小正负数等)(2012、2018)

image

阶码尾数表示的值
全0全00
全0非全0(非规格化小数)2^-126 * 0.xxxx(2018)
全1全0+∞(正无穷大)或 -∞(负无穷大)
全1非全0(非数值)NaN(不是一个数,2012)

2. 浮点数的加减运算

(1)对阶

  • 小阶向大看阶齐,不会产生阶码溢出(2015)
  • 右归时尾数右移,可能会舍掉有效位影响精度

(2)尾数求和 (3)规格化

  • 左归或右归

(4)舎入

  • 恒置1法
    • 只要因移位而丢失的位中有1,就把尾数末位置1(原来是0或1,现在都置为1)
  • 截断法
    • 直接截取所需位数,丢弃后面所有位
  • 0舍1入法
    • 被舍去的最高数值位为0则直接舍去,被舍去的最高数值位为1则尾数的末位加1
    • 这样做可能使尾数又溢出,此时还需要做一次右归(2015)

(5)溢出判断

  • 溢出判断方法

    • 尾数的“溢出”不是溢出,规格化后,阶码的溢出才是真正的溢出(2015)
  • 溢出处理方法

    • 上溢:绝对值太大,会引起溢出中断
    • 下溢:绝对值太小,按0处理,一般不需要溢出中断
溢出类型处理方法
上溢绝对值太大,会引起溢出中断
下溢当绝对值太小,按0处理,一般不需要溢出中断

四、习题

  1. 十六进制的数相加,直接按位相加,逢16进1即可
  2. 十进制转为八进制,可以先转为二进制再转为八进制
  3. 很多十进制小数都不能由二进制精确表示,如1.3
  4. ALU属于组合逻辑电路
逻辑电路类型描述常见电路
组合逻辑电路任意时刻的输出只与当前时刻的输入有关多路选择器、编码器、译码器、比较器
时序逻辑电路任意时刻的输出与当前时刻以及历史状态有关锁存器、触发器
  1. 影响串行进位的并行加法器运算速度的关键因素是进位传递延迟
  2. 定点数运算不存在舎入,舎入不一定会产生误差