计算机组成原理——-补码知多少

计算机组成原理——-补码知多少在计算机系统中,有符号数是如何表示和存储的?如何进行有符号数的加减运算?下面的内容将详细介绍。1.原码的局限性人们想在计算机内部表示有符号数时,最简单和最直接的想法是将数的符号用一个比特来表示,后面加上真值的绝对值。这就是原码的定义,即符号位为0表示正数,为1表示负数。例如,用8比特来表示+1和-1的原码:[+1]原=00000001,[-1]原=10000001。原码的表示虽然简单直观,但实现加减法较为复杂,符号位不能直接参与运算。例如,如果用上述原码进行+1加上-1的运算,则得到的…

  在计算机系统中,有符号数是如何表示和存储的?如何进行有符号数的加减运算?下面的内容将详细介绍。

1.原码的局限性

    人们想在计算机内部表示有符号数时,最简单和最直接的想法是将数的符号用一个比特来表示,后面加上真值的绝对值。这就是原码的定义,即符号位为0表示正数,为1表示负数。例如,用8比特来表示+1和-1的原码:[+1]原=0000 0001, [-1]原=1000 0001。原码的表示虽然简单直观,但实现加减法较为复杂,符号位不能直接参与运算。例如,如果用上述原码进行+1加上-1的运算,则得到的结果为000 000 01+100 000 01 = 100 000 10,计算后结果为-2,显然是不正确的。因此,实际中没有采用原码进行有符号数的表示和运算。目前原码主要用于表示浮点数的尾码。

2.补码

    为了解决原码不能直接进行加减运算的问题,提出了补码的概念。首先通过时钟的例子来理解补码的由来:假设时钟上的时间为上午10点,为了将时间调整到8点,既可以沿逆时针方向拨2个小时,也可以沿顺时针方向拨10个小时。如果逆时针拨动表示减法,顺时针方向拨动表示加法,那么上述两种操作可以分别表示为:10-2=8,10+10=8(mod 12),即-2和10是等价的,10就是(-2)对12的补码,用公式表示为:-2≡+10(mod 12)。这里mod 12表示“模12”,12表示模数。

图片

 

    从时钟的例子可以看出,当负数用补码表示时,可以把减法转换成加法。在计算机系统中,由于机器码的位数是有限的,所以它可以表示的数的个数也是有限的,即系统是有模数的,模数可以认为是最高位进位的权值。当有n个比特时,这个模就是2^n。

·对于定点整数,设补码的形式为xnxn-1…x1x0,其中xn为符号位,则补码的定义是:

当0<=x<2^n时 [x]补 = x

当-2^n<=x<=0时 [x]补=2^(n+1)+x=2^(n+1)-|x|

    定点整数补码可表示的真值范围是[-2^n, 2^n-1],相比原码来说,补码可表示的真值在负方向上多了一个数-2^n,这是由于原码表示中+0和-0的编码不同,而在补码中0的表示唯一,因此补码中会“多出来”一个编码序列,这个序列就用来表示-2^n。

    根据补码的定义,+1和-1的补码(假设为8位)分别为:[+1]补=0000 0001,[-1]补 = 1111 1111,则[+1]补+[-1]补=0000 0000(最高位的1舍弃),即结果是0的补码。可以看出补码进行减法运算时,符号位可以直接参与运算。

·对于定点小数来说,设补码的形式为x0.x1x2…xn,其中x0为符号位,模为最高位进位的权值,故其模为2,则补码的公式为:

当0<=x<1时 [x]补 = x

当-1<=x<=0时 [x]补 = 2+x=2-|x|

    定点小数补码可表示的真值范围是[-1,1-2^(-n)]。类似的,相比原码来说,定点小数补码可表示的真值在负方向上多了一个数-1。

需要注意的是,定点整数和定点小数的补码定义中,都包含了数值-1(定点小数里应该认为是-1.0),两种情况下的补码是不同的。假设用8比特来表示,对于定点整数的-1,其补码为: [-1]补 = 1111 1111;而对于定点小数的-1.0,根据定义,其补码为:[-1.0]补=2+(-1.0)=1.0=1.000 0000。

    目前计算机中普遍采用补码表示有符号整数,如C语言中的char、short、int、long型整数都是采用补码进行表示的。

 

3.负数补码的求解

    对于正数来说,其补码就是其本身,求解简单。对于负数来说,除了按照上面的公式进行求解以外,还可以用以下两种方法来求解:反码法和扫描法。

    反码法:在原码的基础上,符号位保持1不变,数值位按位取反,末位加1。这种方法可以通过反码和补码的公式进行证明。该方法非常适合利用硬件求补码。

    扫描法:已知原码时,符号位保持1不变,对数值位从右到左扫描,右起第一个1及其右边的0保持不变,其余数值位按位求反。这种方法非常适合手动计算。扫描法的硬件实现(对二求补电路)如下:

图片

对二求补电路

    其中E表示原码符号位,a3a2a1a0表示原码的数值位,带星号的四个输出表示补码的数值位(由于符号位不变,所以输出中不体现)

4.变形补码

    变形补码也称为双符号补码,采用两个二进制位来表示数据的符号,其余与补码相同。符号位为00时表示正数,为11时表示负数。对定点小数而言,采用变形补码后,其模为4。因此,变形补码也称为“模4补码”。对定点整数而言,采用变形补码后,其模为2^(n+2)(n表示数值位的位数)。

    变形补码主要用于补码加减法中的溢出检测,当得到的结果中两个符号位的结果相同时,代表没有溢出,当两个符号位不同时,表示发生了溢出。

5.C程序验证有符号整数在计算机内部的存储

    在C语言程序中,整形数据在计算机内部就是用补码形式来存储的。下面通过程序验证-3和+3在计算机内部的存储。

    根据补码求解方法,假设用32位来表示,则+3的补码为:00000000 00000000 00000000 00000011(30个0后面加上两个1),-3的补码为:11111111 11111111 11111111 11111101(30个1后面加上01)

以下通过C语言程序验证+3和-3在计算机内部的存储:

图片

运行结果如下:

图片

    分析:C语言的int型有32位,程序中的两个for 循环分别把+3和-3在计算机内部存储的二进制序列和1对应的二进制序列移位后的结果相与,根据结果输出1或者0,相当于把+3和-3在计算机内部存储的二进制序列的每一位取出来并输出。将程序的运行结果和前面手工计算得到的+3和-3的补码相比较,可以证明程序输出的结果就是两个数的补码,从而验证了int型数据在计算机内部是以补码的形式存储的。

 

今天的文章计算机组成原理——-补码知多少分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/11362.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注