这是一篇关于带符号二进制数据在计算机中表示方法及加减运算的文章,是《计算机原理》这门课程有关内容的总结性笔记。
01 机器数表示方式
1 机器数表示方式
- 原码
- 补码
- 反码
2 原码表示法
又称带符号的绝对值表示。
- 符号位:
“0”——正号
“1”——负号
- 有效数值部分:
二进制的绝对值
3 补码表示法
正数的补码是正数本身,负数的补码是原负数加上模。
那什么是模呢?内容转自
3.1模
模是指一个计量系统的计数范围。如时钟等,计算机也是一个计算器,它也是有一个计量范围,即都存在一个“模”。
- 如时钟的计量范围是0~11,模 = 12
- 32位计算机的计量范围是2^32,模 = 2^32
模是计量器产生“溢出”的量,它的值在计量器上表示不出来,计量器上只能表示出模的余数,如12的余数有0,1,2,3,4,5,6,7,8,9,10,11。
知道了模,我们再来看看补数
3.2 补数
假设当前时针指向11点,而准确时间是8点,调整时间可有以下两种拨法:
- 一种是倒拨3小时,即:
11-3=8
- 另一种是顺拨9小时:
11+9=12+8=8
在以模为12的系统中,加9和减3效果是一样的,因此凡是减3运算,都可以用加9来代替。对“模”12而言,9和3互为补数(二者相加等于模)。所以我们可以得出一个结论,即在有模的计量系统中,减一个数等于加上它的补数,从而实现将减法运算转化为加法运算的目的。
3.3 补码原理
计算机上的补码就是算术里的补数。
设我们有一个4
位的计算机,则其计量范围即模是2^4 = 16
,所以其能够表示的范围是0~15
,现在以计算 5 - 3
为例,我们知道在计算机中,加法器实现最简单,所以很多运算最终都要转为加法运算,因此5-3
就要转化为加法:
# 按以上理论,减一个数等于加上它的补数,所以
5 - 3
# 等价于
5 + (16 - 3) // 算术运算单元将减法转化为加法
# 用二进制表示则为:
0101 + (10000 - 0011)
# 等价于
0101 + ((1 + 1111) - 0011)
# 等价于
0101 + (1 + (1111 - 0011))
# 等价于
0101 + (1 + 1100) // 括号内是3(0011)的反码+1,正是补码的定义
# 等价于
0101 + 1101
# 所以从这里可以得到
-3 = 1101
# 即 `-3` 在计算机中的二进制表示为 `1101`,正是“ -3 的正值 3(`0011`)的补码(`1101`)”。
# 最后一步 0101 + 1101 等于
10010
3.4 补码定义
这里需要解释一下,为什么纯小数的模值为2。从上面的解释我们知道,模就是计量器产生“溢出”的量,那么对于一个纯小数(一位符号位)其表示范围为0.0000……00~1.1111……11
,溢出值是10.0000......00
,它的模是2。
3.5 由原码求补码
- 正数:[X]补=[X]原
- 负数:符号位除外,各位取反,末位加1
4 反码表示法
反码只用于由原码求补码或由补码求原码的中间过渡
正数的反码与原、补码相同
负数的反码符号位1,数值位是将原码的数值按位取反
02 加减法运算及溢出处理
1 计算机中常用补码进行加减运算
这主要是因为相较原码,补码有以下特点:
- 减法运算通过加法运算实现
- 运算时符号位参与运算且结果符号自动产生
2 定点补码加减法运算
基本规则
两个补码的和/查等于和/差补码
即:[X]补±[Y]补 = [X±Y]补 mod 2或2^n
举例
3 运算溢出与溢出处理
溢出
溢出:运算结果超出机器数所能表示的范围
- 一旦发生溢出,运算结果就不正确
- 必须将溢出错位检出
- 溢出只可能发生在两个同号数相加或两个异号数相减时
4 溢出判断
单符号位判断法
-
结果符号判断法
- 同号相加:结果符号与被加数相异则溢出
- 异号相减:结果符号与被减数相异则溢出
-
进位符号判断法
- 数值最高位进位值与符号位进位相异则溢出
双符号位判别法:通过实现变形补码实现
双符号位参与运算,结果双符号位相异则溢出
00:正数,11:负数,01:正溢出,10:负溢出
第一位符号位为运算结果的真正符号位