补码和相关性质

来源:互联网 发布:监控怎么连接网络设置 编辑:程序博客网 时间:2024/04/30 04:09

一、补码与实际值的映射关系

补码是计算机中数值的一种编码方式,补码的定义可以理解为:

已知十进制整数u,则u的补码U为:


其中w表示补码的位数,且w大于|u|的二进制位数。当u为非负值时,u的补码是其本身。u为负数时,u的补码U满足:


例如:求-2的补码,补码用4位表示。

-2的补码为:U=2^4-2=16-2=14=[1110]。14用二进制表示为1110,即-2的补码为1110。

从补码到十进制实际值的映射关系为:

若补码U的二进制位数为,则U表示的十进制实际值u为:


补码和实际值之间满足一一映射关系,即当补码位数w一定时,任意补码唯一对应实际值,任意实际值唯一对应补码。


证明一一映射关系分为3步,1.证明从u到U是一对一映射,2.证明从U到u是一对一映射,3.证明u的集合和U的集合元素个数相等,可使用反证法证明。

假设用8位补码表示数值,其补码可表示的十进制数值范围为[-128,127]。0的补码是0,-128的补码是0x80。128=2^7, -128的补码为2^8-2^7=0x80。0x80又是128的二进制表示。注意,有符号数的二进制原码以最高位为符号位,0存在+0和-0,-0的原码与-128的补码表示相同,但原码表示和补码表示是两种不同的数值映射,不存在谁依赖谁的关系。

二、补码的性质

1、w位的补码对应的实际值的范围

       当补码位数w一定时,补码可表示的实际值最小整数TMin和最大整数TMax之间总存在关系:TMin = -TMax-1,其中TMax>0。可使用U到u的映射公式和二项式定理证明此关系。

2、补码表示的实际值正负

       补码有一个重要的特性:任何负数的补码U的最高位总是1,正数和零的补码最高位总是0,反之亦然。

3、补码的相关运算

(1)加法

                    已知x+y=z,则 [x]补+[y]补=[z]补。不溢出的情况下成立,即z可用w位补码表示。

(2)乘法

                    已知x*y=z不溢出,则([x]补*[y]补)mod(2^w)=[z]补,即[x]补*[y]补=[z]补=[x*y]补。

(3)除法

                    已知z=x/y,则[z]补=[x]补/[y]补。


三、计算机中补码运算的本质

       计算机底层不区分无符号数和补码数,可认为其运算全部当作无符号数处理,即补码值全部当作无符号数,并对无符号数进行运算。因实际值u和补码U总保持一一映射关系,由补码性质可知,在不溢出的情况下这种运算方式总是正确的。

 C标准库中补码表示的陷阱

       我们注意到,C标准库中表示INT_MIN时,实用如下形式:

#define INT_MAX    2147483647#define INT_MIN    ( -INT_MAX -1 )
为什么不表示为#define INT_MIN  -2147483648。原因在于-2147483648的补码默认不直接用32位表示,而是表示为更大位数的补码。而int类型补码是32位的,通过加法运算使之保持位数不变,可使INT_MIN的补码保持32位。


四、补码的快速求解


1、在已知原码的情况下快速求出补码

原码的最高位(符号位)保持不变,其余位数取反并加1,舍去溢出值。例如:-2的8位原码是0x82,即1000‘0010,则-2的补码为:000’0010取反111‘1101,加1变为111’1110,补上符号位变为1111‘1110,这与通过定义计算的补码相同。再如,已知8位原码为1000‘0000,则000’0000取反111‘1111,加1变为000’0000,最后补全符号位变为1000‘0000。

原码除符号位以外其余位数不全为0时,补码计算时不会溢出,唯有当除符号位以外的其余位数全部为0,即原码有形式:1000...00时,才会产生溢出。


2、补码与无符号数的关系

已知实际值u <->  二进制补码 = 无符号原码  <-> 无符号数Ux,在二进制值不变的情况下,实际值u与无符号数Ux的关系为:


该关系的证明如下:若u为负数,则U补码的最高位一定为1,那么:


而实际值u的补码U为:


即满足关系:。当u为非负数时,满足Ux=U=x。


3、补码位数的扩展

        非负数的补码仍是正数,因此非负数补码的扩充只需要在高位补零。负数的补码扩充需要在高位补1。为什么:

根据补码的定义:U=2^w -|u|,当u一定时,w变化,假设w1为扩充后的位数,则w1>w。

那么,U1=2^w1-|u|,U1-U=2^w1-2^w =[111...111'0000...0],从第w+1位开始到w1位全部为1。


4、补码加法的溢出

       w位补码进行加法时,因溢出可能出现3种情况,对应加法运算结果add为:


对应不溢出、正溢出和负溢出的情况。


5、补码乘法的溢出。

      补码乘法时,溢出的情况比较复杂,计算机中补码乘法的结果(包括溢出和不溢出情况)可用如下公式计算。

对于实际值x和y,对应w位补码Ux和Uy,其Ux和Uy在计算机中相乘的结果为:




参考文献《深入理解计算机系统》(第三版)

                《计算机组成原理》(唐朔飞第二版)




0 0
原创粉丝点击