当前课程知识点:微机原理与接口技术 > 第1周 微型计算机基础概论 > 第5讲 计算机中数的表示与运算 > 符号数的表示
好 我们下面来说一下
首先来说一下原码
原码就是
用0
用最高位是符号位
其余就是数值部分
所以原码
如果可以简单的
可以这么表示
也就是说符号位加绝对值
那么符号位
我们刚才说
正数是用0来表示
负数用1来表示
我们在十进制数里
我们说那个正号
实际上一般是不写的 对吧
没人说10
一定要写成正10
只有是负10的时候
那个负号才会写
但是在二进制数里
符号位是必须要写出来
是0就是0
是1 就是正数必须有0
负数必须有1
这个0是不能省略的
这个是原码的一种表示
这个原码的表示方法
大家一看
就觉得太好理解了
这跟和我们人的习惯
完全是一样的
但是这种表示方法
其实在今天用的并不多
为什么呢?
就是
它虽然这么简单
这是它的好处 对吧
但是它有一个巨大的不足
我们现在想
如果我们要去做一个
两个数去做
相加
我们首先
要是如果原码表示的话
作为计算机
就是从人来讲
我们首先要去判断
这个两个数的性质
是不是一样的
也就是说它到底是不是
都是同符号
还是异符号
如果是同符号
那么两个数相加
那就是相加
如果是异符号
那就变成相减
相减完了
那么现在
到底相减的结果
是正还是负
我们还要去判断
这两个数到底哪一个
绝对值大
然后
最后结果
符号位
和那个大的数
绝对值大的那个符号
是一致的
所以这个
这些过程
在我们的人的脑袋里
可能是
一瞬间
计算机当然更是一瞬间
但是再一瞬间
它也需要花时间
所以它很麻烦
再一个 原码的
因为这样子的一个麻烦
所以我们实际上
它就变得比较慢了
对吧
另外原码的
一个不足的地方是
0的原码不为1
我们说0
实际上是数字
或者说数学运算的一个基数
比如它的基准
一个基准
它都不为1
这个是很麻烦
怎么不为1法
我们现在来看一下
比如我们说正0
因为正号用0来表示之外
这个就是正0的原码
那么还可能有负0
负的话我们
负号用1来表示
这就是负1
所以
有正0和负0之分
这个连基线都不一致
所以这个就
变得比较麻烦
因此在今天的计算机中
特别是加减运算中
这绝对不使用原码来表示
好了
为了解决这个问题
又有另外一种表示方法
叫反码
反码的定义是这样
如果这个数是正数的话
它的反码
就和原码是一样的
如果这个数是负数的话
那么它是在原码基础上
符号位不变
其余数字部分
按位取反
这就得到了反码
比如我们来看一个例子
假设这个X等于-52
52我们通过
除2取余
我们转换成二进制数
就是这样一个值
0110100
对吧
这个负号继续写在这里
那么X的原码等于多少呢?
我们把这个负号用1来表示
这就是X的原码
那么
因为它是负的
所以它的反码
和原码不一样
它的反码是符号位不变
数值部分
按位取反
这就是它得到了
它的反码
那么
有了这个反码
解决没有解决
刚才我们原码那样的一个问题
我们来看一下
首先
我们就来看一下0的反码
0的反码
我们刚才说
正0的原码是
比如用八位二进制
来做例子的话
正0的原码
就是八位0 对吧
那么因为
正0的反码
和正0的原码是一样的
所以正0的反码
也是这样
但是负0
因为负数的补码和原码
负数的反码和原码不一样
所以
负0的反码
就得到了这个值
有人告诉你
这八个1
它实际上表示0
这个我们从直观上感觉
也好像很难接受
而且
这也没有解决0的
这个唯一性问题
所以
反码在今天的计算机中
实际上也没有使用
那么我们今天使用的
最频繁的
或者说大家
默认的一种方式是什么呢?
是补码
补码的含义
它的定义是这样
就是如果
对于一个正数来讲
补码和它的反码
和它的原码
都是一样的
那么
对于一个负数来讲
补码和原码就不一样了
它是在
原码的基础上
符号位不变
其余数字部分
按位取反再加1
也就是说
补码是
对于一个负数的补码
是它的反码
再加1
这样得到这样的一个结果
好
我们也同样做一个例
还是刚才那个-52
通过除2取余
我们得到了它的真值
是这样的一个值
好了
那么它的原码
就是这样一个值
因为这是一个负的
所以它的反码
就是符号位不变
其余数值部分
按位取反
就得到这么一个值
然后它的补码
是在反码的基础上
再加1
就得到了这样一个值
这就是补码
我们看一下
补码解决没有解决
我们刚才
总是纠结的
那个0的
唯一性问题
对于一个正数
也就是正0的补码
因为和原码一样
所以 这个
还是这个八个0
我们用八位0
十六位0
二十四 三十二位0
都是这样的一样的
所以我们现在
这门课里为了简答起见
我们不再考虑
你今天的计算机是64位的
我这里顺便说一下
就是说
我们都是用8位
做例子来介绍
其实它的字长嘛
都没有什么关系
所以这个用8位
简单一点
这是
正0的补码
和它的原码是一样的
都是八个0来表示
那负0呢?
我们来看一下
负0的补码
等于负0的反码加1
那么负0的反码
刚才我们已经说了
如果用八个1来
用八位来表示的话
是等于是八个1
那么
再加1等于多少呢?
得到了这个值
这个值
就多出来了一个1
就最高位我们看
多出来这个1
这个多出来这个1
假设我们现在的路
就只有这么宽
也就是说只有八位
这个通道
那么这个1
等于相当于被挤下去了
这个1
那么在我们现在
能够看到的
这个八位字长的
这个范围内
我们已经看不到那个1了
我们看到的是八个0
这个就变成了
和正0的补码
变成一样的形式了
所以
补码就解决了
这个0的唯一性问题
我们下边
来对补码做一个说明
假设
我们补码来自于
实际上来自于
一个同域的概念
我们用一个
我们经常带的手表
这样一个例子来
来举例
我们如果现在想
从5点拨到1点
我们实际上
可以有两种拨法
我们既可以顺时针拨
我们也可以逆时针拨
我们逆时针可以
5-4=1
顺时针拨呢
我们可以
5再一直拨过去
从5一直绕过去
对吧
加上8
最后也可以等于1
这就是
我们的拨表的
两种方式
为什么我们这两种方式
都能拨出1呢?
是因为
我们现在
手表是以12为模的
在这个12为模的
这样子的一个前提下
就有了
这样子的一个表达式
我们看上去
很怪异的一个表达式
就是5-4=5+8
这个放到别的地方
实际上
如果去掉这个模12
这样子的一个
前提的话
这个表达式肯定是不成立的
但是
在模12
这样的一个前提下
这个表达式
就变成了成立
在这个表达式
意味着什么呢?
意味着这个-4和8
是互为补数的
也就是说
负数的补数
或者说我们说
它的补码
等于12-4=8
就得到了这样一个结果
因此
这个结果
我们用这样的
一个表达式
可以表示成这样
就是说5-4
等于5加-4
等于5+12-4
等于5+8
最后等于12+1
因为12是模
把12去掉
就等于1
就成了这样一个结果
所以
这个补码带来的一个
巨大的好处
从底下这个表达式
就可以得出来
它就是
主要引入补码的理由是什么?
就是要希望
能够将减法运算
转换为加法运算
这个最早的来源
是因为我们
当初的硬件
实在太贵了
我们希望能够
越便宜越好 对吧
所以 我们希望
我们在这个运算器里
最好就只有加法
即加减乘除
我们最好都只有加法器
所以
有了加法器以后
我们要做减法怎么办呢?
我们通过补码的形式
把减法变成加法运算
然后再去求和
实际上乘法运算
刚才我们说
就是
大家去仔细琢磨琢磨
乘法就是不断的
去和中间积乘
然后最后
把中间积一个一个的
通过这样子向左的移动
然后再加起来
所以 乘法
实际上是移位和加法的运算
除法
是移位和减法的运算
因为它是乘法的逆运算
而减法
又通过这样的补码的形式
也变成了加法的运算
所以就
总而言之
加 减 乘 除
都可以把它变成
加法和移位的操作
这样我们硬件
就可以简单一点
而且就可以便宜一点
这也就是
我们补码的一种
主要的利用
所以
补码的运算
就是将减法运算
变成了加法运算
它的推理
是可以这样
X+Y的补码
等于X的补码
加Y的补码
那么X-Y的补码
可以等于
X加负Y的补码
也就是等于
X的补码
加负Y的补码
最后
就可以得出
变成把减法运算
变加法运算了
好
我们下面用一个例子
来看一下我们
比如我们用十进制来表示
我们要做一个
66-51的运算
66-51
就等于66
加-51
等于15 对吧
这个是大家做这个运算
没问题
那么我们要
计算机要做这么一个工作呢?
我们当然要把它
转换成二进制数
所以
转换完了以后的结果
就是这样
66因为它是正数
所以它的补码
和它的原码
是一样的
所以
经过除2取余
就得到了这样的一个结果
这就是66的二进制数
那么51呢?
因为
它是负的
那么它的原码
没问题
符号位加数值部分
这个数值部分
大家现在反应过来了
就是它的绝对值 对吧
51我们除2取余
得到了这个绝对值
然后这个负号
用1来表示
所以这就是-51的原码
按照我们刚才说的
用补码来做的话
我们
把这个原码
要转换成补码
因为它的是负数
所以它的补码
不等于原码
是原码基础上
符号位不变
绝对值这一部分
按位取反加1
这就得到它的补码
然后
我们做
X+Y的这个补码
用加法
来做这样的一个运算
相加的结果
就得到了这么一个值
同样的
因为最高位
这个红颜色这一位
已经超出了
我们八位的有效字长
所以
它就已经看不到了
看不到了
我们就认为
它已经没有了
我们
当然你后面学了会知道
我想有的话
我也可以把它拿出来
我现在不想有了
我们就看不到了
所以我们看到的
最后的结果
就是这个00001111
而这个结果正好就等于
十进制的15
和我们前面的
十进制运算的结果
是一样的
这个是二进制的补码
从这个例子里
我们证明了
补码它的意义
或者它的价值
它既解决了0
唯一性问题
又使得
把减法运算
变成了加法运算
我们再来
看一个例子吧
这个例子是
X等于
这样子的一个-52
那么
转换成二进制
就是这样一个值
Y等于正的116
那么
现在要你求
X+Y等于多少?
当然大家
如果用笔头来做的话
当然这种问题
对大家很简单
我们现在模拟一下
计算机做这件事情的过程
首先 计算机
会把他们全部都翻译成
补码的形式
对于X来讲
同样的
因为它是负的
所以它的原码
是这样一个值
那么它的补码
是原码基础上的一个变换
那么 Y是正数
所以它的原码和补码
是一样的
那么
做这样X+Y的运算
相加的结果
是这样的一个
过程
然后最后
得到这么一个结果
这个结果大家看
最高位是正
对吧
最高位是0
是正数
所以
因为最高位是0
所以
这个X+Y的补码
是正数
因为
是正数
所以
它就等于
X+Y的原码
也就等于它
大家听我们再说一遍
因为
这个相加的结果
最高位是0
表示这个数是正数
我们说
一个正数的补码
就等于它的原码
所以就是说
X+Y的补码
现在等于这个01000000
所以X+Y的原码
也就等于01000000
那OK了
X+Y
因为原码的定义是
符号位加绝对值
所以现在后面
就是它的绝对值
这就是X+Y的值
这个是补码的表示
以及它的价值
或者说它的意义
在今天的计算机中
因为补码实现了0的唯一
又使得
将减法运算
变成了加法运算
所以
我们今天计算机中
默认的所有的符号数
都是以补码的形式
来表示
事实上
我们又回到刚才那个问题
我们说这个数是
性质到底是符号数
还是无符号数
实际上是指硬件系统
是无法实现的
是无法识别的
那么
今天我们在编程序的时候
不论用哪一种语言
即使用我们后边要学到的
汇编语言这样的低级语言
我们依然是用
助记符形式来描述的
不是用0和1这样的机器语言
来描述的
那么 所以
我们今天
所编写的程序
都是具有一个编译的过程
那么
编译器
它就在做
这样的一个转换
或者说这样一个识别的过程
我们假设
大家未来
我们实际
学完第四章
我们在这样的一个环境下
大家去编汇编程序的时候
我们可以做这样的一个测试
比如你定义了一个数
它是一个负数
假设你输入一个-3
-3输入的时候
你写的是-3
没有问题
但是经过编译以后
你再去进到调试环节下
你去看这个-3
你已经看不到这个-3了
看到的是什么呢?
是这个FDH
为什么是FD呢?
FD就是11111011
对吧
那么为什么是这个呢?
我们大家可以自己去
测算一下
这个11111011
正好就是-3的补码
这就是
我们
编译器
为大家做的一件工作
-第1讲 关于本课程
--关于本课程
-第2讲 微型计算机系统
--微机系统_01
--微机系统_02
-第3讲 微型计算机一般工作过程
-第4讲 数制与编码
--计算机中的编码
-第5讲 计算机中数的表示与运算
--数的表示
--符号数的表示
--数的表示与运算
-第6讲 基本逻辑运算与逻辑电路
-第7讲 本周小结
--本周小结
-第1周 微型计算机基础概论--第一周单元测验
-第8讲 8088微处理器
-第9讲 8088 CPU主要引线及机构
-第2周 8088微处理器--第二周单元测验
-第10讲 实模式存储器寻址
-第11讲 8088系统总线
--8088系统总线
-第12讲 微处理器小结
--微处理器小结
-单元测验--作业
-第13讲 指令概述
--指令概述
-第14讲 寻址方式
--寻址方式
-第15讲 通用数据传送指令
-第16讲 地址传送指令
--地址传送指令
-第17讲 输入输出指令
--输入输出指令
-第4周 数据传送指令--第四周单元测验
-第18讲 算术运算指令
--加法运算指令
--减法指令
--乘除运算指令
-第19讲 逻辑运算指令
-第20讲 移位操作指令
--移位操作指令
-第5周 算术运算、逻辑运算与移位操作指令--第五周单元测验
-第21讲 关于串操作指令的说明
--串操作指令说明
-第22讲 串传送与串比较
--串传送与串比较
-第23讲 串扫描指令
--串扫描指令
-第24讲 串装入与串存储指令
-第六周单元测验--作业
-第25讲 程序控制指令说明
-第26讲 转移类指令
--无条件转移指令
--条件转移指令
-第27讲 循环控制指令
--循环控制指令
-第28讲 过程调用指令
--过程调用指令
-第29讲 中断指令
--中断指令
-第30讲 处理器控制指令
--处理器控制指令
-第31讲 指令系统小结
--指令系统小结
-第7周 程序与处理器控制--第七周单元测验
-第7周 程序与处理器控制--第七周作业
-第32讲 汇编语言源程序
-- 汇编语言源程序_01
-- 汇编语言源程序_02
-第33讲 伪指令
--数据定义伪指令
--其它伪指令
-第34讲 系统功能调用
-第35讲 汇编语言程序设计示例详解
--程序设计示例1
-第36讲 汇编语言程序设计小结
-第8周 汇编语言程序设计--第八周单元测验
-第8周 汇编语言程序设计--第八周作业
-第37讲 半导体存储器概述
--半导体存储器概述
-第38讲 内存单元编址
--存储单元编址
-第39讲 随机存取存储器RAM
-- RAM_01
--RAM_02
-第40讲 只读存储器ROM
--ROM_01
--ROM_02
-第九周单元测验--作业
-第41讲 半导体存储器扩展
--存储器扩展_2
-第42讲 半导体存储器小结
--半导体存储器小结
-第十周单元测验--作业
-第十周作业--作业
-第43讲 基本I/O接口
-第44讲 简单接口芯片
--简单接口芯片
-第45讲 基本输入输出方法
--基本I/O方法
-第46讲 简单I/O控制系统设计
-第47讲 中断技术
--中断技术1
--中断技术2
-第48讲 输入输出与中断技术小结
--本周小结
-第十一周单元测验--作业
-第49讲 可编程定时计数器
-第50讲 可编程并行接口
-第51讲 可编程接口小结
--本周小结_01
--本周小结_02
-第十二周单元测验
-第52讲 模拟量的输入输出
--模拟量的输入输出
-第53讲 D/A转换器
-第54讲 A/D转换器
-- A/D转换器_01
-第十三周单元测验--作业
-第55讲 I/O接口系统综合设计示例详解I
-第56讲 综合设计示例详解II
-第57讲 结束语
--结束语