带符号整数在计算机中的应用
带符号整数,即"整数",-2、-1、0、1、2、3、4
带符号整数,在计算机硬件内,如何表示?
带符号整数的加法、减法运算是怎么用硬件实现的?
带符号整数的表示
原码、反码、补码
如机器字长8位,该计算机硬件能支持的带符号整数位数上限8位,通用寄存器只能存8位
原码表示
真值 : +19 -> 二进制 : +10011 0,0010011 8bit寄存器
真值 : -19 -> 二进制 : -10011 1,0010011 8bit寄存器
原码:
-
符号位"0/1" 对应"正/负",剩余的数值位表示真值的绝对值
-
若机器字长n+1位,带符号整数的原码表示范围:-(2^n-1) ≤ x ≤ 2^n-1
-
真值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…
个人学习记录,欢迎评论交流!