补码与算术右移指令
补码杂谈
补码的优越性,使得用最高位作符号的原码显得多余。正数的补码是它本身,负数的补码通过对其绝对值进行求补获得。求补运算是将数值按位取反,再加一。不要与补码的概念混淆。它具有许多的优良的特性。
求补过程与反求补过程为同一过程,也就是说,对一个数求补两次后,还是这个数本身。通过补码的物理意义这是很好理解的。也可以分析求补的运算过程来说明。对某数按位取反后,加上1,这时开始从最低位向高位进位,直到某个高位上为零,无法向更高位进位为止(当然有个极端的情况的就是对0求补,而0的求补结果为其本身,大可抛开它不谈)。产生的效果是最低的若干位被取反,且这若干位的形式应该为1加上若干个0(当然可以是0个)。这些被加1影响的若干位就相当于被取反了两次,也就是说得到的是它们原来的样子。而未被加1影响的部分则被取反了一次。再进行一次求补运算,看看会出现什么结果。先取反,这样未被加1影响的部分就进行了两次取反而恢复了原貌。而被加1影响部分取反后得到的形式为一个0带上若干个1(可以为0个1),这样的形式在加上1后会被全部取反,而不影响别的部分。这样这部分又恢复了原貌。所以整个数又恢复了原貌。
用补码进行加法运算的时候,易于判断结算是不是溢出。判断的方法是计算次高位与最高位向其高位的进位的异或,结果若为0则表示正常,否则表示溢出。溢出的情形无非两种,分别为两正数与两负数相加的时候。两正数相加是次高位进位时,显然是溢出的情形,而这时最高位为0,无法再进位,这样进位异或结果为1,反映溢出;两负数相加时,最高位肯定有进位。这样,只有次高位无法进位时,才使异或结果为1。而这时,表示的就是溢出。可以把负数的绝对值看成油罐中的油,其补码除最高位后的部分可以看成油罐中的剩余空间。当两罐油倒成一桶进,如果剩下的空间没有够一罐,那么油一定溢出了。
算术右移指令
算术右移指令SAR(shift arithmetic right)的操作是,将寄存器中的数值右移,最左端用最高位填充,而不是补零。这里分析它为什么不直接补零的原因。为方便讨论,考虑右移一位的情况。右移若干位的情况,也可做相似的分析。
不直接补零的根本原因是为了不改变数值的符号并且使得数值是原来的一半。众所周知,符号数是以补码的形式存储在计算机内的。正数的补码是其本身,最高位为0。 右移1位时,最高位补零,其值缩小一半。这没有什么问题。对于负数,其补码为对其绝对值求补后获得。最高位补1,也相当于次高位补1,能达到缩小一半的效果吗?那要看右移后对应的原码是否为原来的一半了。也就是,在最高位与次高位是不是0。要查看原码,只需对结果求一次补就行了。求补第一步是取反,这样填充的1就成了0,没有出现问题,但还得看第二步加1。哪些情况下加上1可能会影响次高位呢?答案只有两个数。当原来的补码除最高位与最低位都是0的时候,右移一位后除最高位外都是0,在求补进取反后这些0变成了1,加1后,进位会影响到次高位,使之变成1(经取反后,次高位被置成了0),而原码的次高位应该填充0的,这样就没有达到缩小原数的效果。以4位数为例,这样的数为:1000,1001。1000如果要计算机看成符号数的话,会被看成-16!而其它数,因为中间部分有1,取反后变成了0,加1后的进位不能影响到次高位,所有可以达到缩小原数且不改变符号的效果。
计算机求补的情形不多,一是指令中的数含有负号的时候,但如果指令中出现负0,也就是‘-0’汇编器会把它变成0。二是作减法运算的时候。
分享到:
相关推荐
计算机组成原理实验报告-八位补码加减法器的设计与实现.pdf计算机组成原理实验报告-八位补码加减法器的设计与实现.pdf计算机组成原理实验报告-八位补码加减法器的设计与实现.pdf计算机组成原理实验报告-八位补码加减...
2、输入为两个4位含符号位的补码数,输出结果亦是含符号位的数补码。 图7带求补级的阵列乘法器方框图 要求: 1、能够正确输入两个4位(含符号位)的补码,并通过计算得到正确的结果。 2、验证结果,输入两个均为...
包括两部分 16位数 16进制补码计算和32位 16进制补码计算器
C#代码实现补码的加、减运算,真实的模拟真实计算机的补码运算过程,如果觉得算法不是很高效,可以自行替换相应部分。
利用C++的MFC实现原码、补码、反码的转换
将原码转换成补码,再将补码转成原码的matlab程序
输入一个左边界数值(下记作a),一个右边界数值(下记作b),选择结果类型,如果选择循环移位,输入循环移位数值(正数右移,负数左移),针对 [a, b]区间内的每个数值n,先将十进制变成二进制,按照指定数值(正数...
关于补码以及基本的补码运算
针对补码这个常见的概念,引申到小数的补码,并且用实例说明其运算规则。
学习如何计算补码,补码的转换等,掌握补码功能
要想在FPGA的世界里随心所欲的进行有符号运算,必须先对补码有一个很好的认知,本文介绍了Verilog中的补码计算
原码、反码、补码、移码与浮点.doc
1、设计一个能够完成8位补码加减法运算器,采用8位数据总线结进行数据的输入、输出。利用行波(串行)进位的方式,并具备数据锁存功能和溢出判断功能。 2、输入数据为补码,其中高1位为符号位,低7位为数据位,运算...
十个八位十六进制数字,装换为二进制,然后取其补码,然后求其平均值。用c编写,代码稍微有点问题,大家可以完善下
logisim补码一位乘法器设计.txt
原码反码补码图解.原码反码补码图解.原码反码补码图解.
计算机组成原理-定点补码阵列乘法器(3x3)实验报告 (2).pdf计算机组成原理-定点补码阵列乘法器(3x3)实验报告 (2).pdf计算机组成原理-定点补码阵列乘法器(3x3)实验报告 (2).pdf计算机组成原理-定点补码阵列乘法器(3x3)...
设计要求: 1、掌握全加器的使用。 2、设计一个8位补码生成电路(包括符号位)。 3、要求用MULTISIMS设计电路并仿真。
c++ 计算机底层 原码反码补码的练习题,包括答案
用vb做得小程序,也是课堂上的作业,可能有些小bug