补数/补码的意义

来源:互联网 发布:java double向上取整 编辑:程序博客网 时间:2024/04/30 12:51

前言

之前在大学的数字电子技术这门课程学到这个概念,但一直没有应用过,最多就是做过课后作业。本人目前做的是工控行业,工控就离不开电机的控制,工控行业里常见的三种控制方案,一是PLC,二是运动控制卡,三是单片机,我做的是的单片机这一块,众所周知定时器是单片机的基础外设,而行业内对使用单片机对电机进行控制,往往用的是定时器。使用定时器对电机控制的方式有溢出中断的方式,还有就是比较中断的方式,这里使用的是比较中断的方式,又因为电机的加减速表是用软件自动生成的,生成的表为升序表,升序表很显然不能用比较中断的方式进行控制,否则电机得运动就变成先减速后匀速然后又加速,显然不是我们需要的,我们需要的电机运动过程是先加速后匀速最后减速这么一个过程。如果我们能把升序表变成降序表,问题不就解决了吗?对,没错。那有什么方法呢?我们分析了一下电机的运动过程,如果能按照逆方向运行,那就是我们想要的了,于是想起了钟表的运行,当前指针指向6点钟方向,要指向3点钟方向,我们可以顺时针转过9格,也可以逆时针转过3格,这也是补码的一个典型特点,于是就联想到了补码。通过补码我们就可以把整数把大化小,把小化大,这样就能把升序表变成降序表了,于是问题就迎刃而解了。下面我们来讲下关于补数的基本知识。

补数是一种处理有符号数的方法,用于变换数字的符号。常在计算机科学中应用,被称为【补码】,在台湾和香港被称作二补数。

关于补码
补数在计算机中被成为补码(在港台被称为二补数)
有符号的二进制数的补码运算方法为:
正数:补码为其本身
负数:除符号位外,所有位取反(即原码的反码),然后+1(简称为求反加一)。
如:-1101 的补码为
1. -1101的原码为 11101(第一位为符号位)
-1101的反码为 10010(第一位为符号位)
-1101的补码为 10011(第一位为符号位)
整数的补码定义
[x]补={ 0,x|( 2^n >x >=0)}和{ 2^(n+1)+x|(0>x>=-2^n)(mod 2^(n+1))

 

计算机科学中的应用

计算机科学中,补数的最大应用点为,在处理加法和减法中,不会因为数字的正负使用不同的计算方式。只要一种加法电路就可以处理各种有符号数加法,而且减法可以用一个数加上另一个数的补数来表示,因此只要有加法电路及补数电路即可完成各种有符号数的加法及减法,电路设计上相当方便。

 

补数的概念
在日常生活中,常常会遇到补数的概念,例如时钟指示为六点,想要它指向三点,可以按顺时针方向将分针转九圈,也可以逆时针方向转三圈,结果是一致的。由于时针转一圈为12小时,而其中12在时钟里是不被显示而自动丢失的,即15-12=3,15点和三点在时钟表示上是一致的。想想一下,在时钟这个问题上,任何时候时针向顺时针转九圈和逆时针转三圈的效果都是一致的,我们将方向定位正负,即-3与+9等价。而数学上称12为模写作(mod 12),而称+9是-3以12为模的补数记为
-3  +9(mod 12)
-4  +8(mod 12)
-5  +7(mod 12)
【以上截取自《计算机组成原理·第二版》唐朔飞著p221】
可以将模理解为一个足够大的正数,足够大到比你运算所有数字的绝对值都要大。


结论:(在模确定的情况下)
一个负数可用它的正补数来代替,而这个正补数可以用模加上负数本身来得到。
一个正数和一个负数互为补数时,两数的绝对值之和为模
正数的补数为其自身。

0 0
原创粉丝点击