带符号整数在计算机中的应用(学习笔记-王道计算机组成原理)

225 阅读3分钟

带符号整数在计算机中的应用

带符号整数,即"整数",-2、-1、0、1、2、3、4

带符号整数,在计算机硬件内,如何表示?

带符号整数的加法、减法运算是怎么用硬件实现的?

带符号整数的表示

原码、反码、补码

如机器字长8位,该计算机硬件能支持的带符号整数位数上限8位,通用寄存器只能存8位

原码表示

真值 : +19 -> 二进制 : +10011 0,0010011 8bit寄存器

真值 : -19 -> 二进制 : -10011 1,0010011 8bit寄存器

原码:

  1. 符号位"0/1" 对应"正/负",剩余的数值位表示真值的绝对值

  2. 若机器字长n+1位,带符号整数的原码表示范围:-(2^n-1) ≤ x ≤ 2^n-1

  3. 真值0有两种形式: +0 和 -0, [+0]原 = 0,0000000; [-0]原 = 1,0000000

    常见书面写法: x= -19 [x]原= 1,0010011

    若未指明机器字长,也可以写为: [x]原 = 1,10011

原码的缺点

原码的缺点: 符号位不能参与运算,需要设计复杂的硬件电路才能处理,费钱!贵!

用补码表示真值--符号位可以参加运算

原码 -> 反码 -> 补码的转换(机算)

正数 : 三者一样

x = +19 [x]原 = 0,0010011, [x]反 = 0,0010011, [x]补 = 0,0010011

x = +50 [x]原 = 0,0110010, [x]反 = 0,0110010, [x]补 = 0,0110010

负数 : 原码转反码 符号位不变,数值位取反,反码转补码 末位+1

x = -19 [x]原 = 1,0010011, [x]反 = 1,1101100, [x]补 = 1,1101101

x = -100 [x]原 = 1,1100100, [x]反 = 1,0011011, [x]补 = 1,0011100

原码、补码快速转换技巧(手算)

正数: 两者一样

负数: 原转补,补转原, 从右向左找到第一个1,这个1左边的所有"数值位"按位取反.

x = -19 [x]原 = 1,0010011, x[补] = 1,1101101

x = -100 [x]原 = 1,1100100, x[补] = 1,0011100

补码的加法运算(例1)

补码数值位不能解读为位权

计算机硬件如何做补码的加法: 从最低位开始,按位相加(符号位参与运算),并往更高位进位

A : +19 -> 补码 0,0010011 8bit寄存器

B : -19 -> 补码 1,1101101 8bit寄存器

A + B = 0 -> 补码 0,0010011 + 1,1101101 = 0,0000000

补码的加法运算(例2)

A : -19 -> 补码 1,1101101 8bit寄存器

B : -19 -> 补码 1,1101101 8bit寄存器

A + B = -38 = 1,1101101 + 1,1101101 = [1,1011010]补

[1,1011010]补 -> [1,0100110]原 -> -38

补码的减法运算

Tips: 加法电路造价便宜,减法电路造价昂贵.若可将减法转变为加法,省钱!

[A]补 - [B]补 = ? 能不能减法变加法?

A - B = A + (-B) [A]补 - [B]补 = [A]补 + [-B]补

接下来要解决的问题: 已知"减数"的补码,如何求其负值的补码表示?

[B]补 <-> [-B]补 全部按位取反、末位+1

x = 19 [x]补 = 0,0010011, [-x]补 = 1,1101101

-x = -19 [-x]补 = 1,1101101, [x]补 = 0,0010011

学习地址: www.bilibili.com/video/BV1ps…

个人学习记录,欢迎评论交流!