补码

✍ dations ◷ 2025-01-04 07:18:01 #补码

补码(英语:2's complement)是一种用二进制表示有符号数的方法,也是一种将数字的正负号变号的方式,常在计算机科学中使用。补码以有符号比特的二进制数定义。

正数和0的补码就是该数字本身再补上最高比特0。负数的补码则是将其对应正数按位取反再加1。

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

另外,补码系统的0就只有一个表示方式,这和反码系统不同(在反码系统中,0有二种表示方式),因此在判断数字是否为0时,只要比较一次即可。

右侧的表是一些8-bit补码系统的整数。它的可表示的范围包括-128到127,总共256(=28)个整数。

以下用4位的补码数字来说明补码系统的数字表示方式。

以上的表示方式在电脑处理时格外方便,用以下的例子说明:

    0011 (3)  + 1111 (-1)--------------   10010 (2)

结果10010似乎是错的,因为已经超过四个比特,不过若忽略掉(从右开始数)第5个比特,结果是0010 (2),和我们计算的结果一样。而且若可以将二进制的1111 (-1)变号为0001 (1),以上的式子也可以计算减法:3-1 = 2。

在n比特的补码加减法中,忽略第n+1个比特的作法在各种有号数加法下都适用(不过在判断是否溢出(overflow)时,仍然会用到第n+1个比特)。因此在补码的系统,加法电路就可以处理有负数的加法,不需另外处理减法的电路。而且,只要有电路负责数字的变号(例如将1变换为 -1),也可以用加法电路来处理减法。而数字的变号就用计算数字的补码来完成。

在一般n比特的二进制数字中,最高有效比特(MSB)第 n比特代表的数字为 2−1。不过,在n比特的补码系统中,最高有效比特(MSB)第 n比特表示符号比特,若符号比特为0,数字为正数或0,若符号比特为1,数字为负数。以下是n比特的补码系统中,几个特别的数字:

因此,在8位的补码系统中,可以表示的最大正数为2−1-1 = 127,可以表示最小的负数为 -2−1 = -128 

在计算二进制数字的补码时,会将数字进行比特反相运算,再将结果加1,不考虑溢出比特(一般情形,溢出比特会为0),就可以得到该数字的补码。

以下考虑用有符号位8位二进制表示的数字5:

其最高比特为0,因为此数字为正数。若要用补码系统表示 -5,首先要将5的二进制进行反相运算〔1变为0,0变为1〕:

目前的数字是数字5的反码,因此需要再加1,才是补码:

以上就是在补码系统中 -5的表示方式。其最高比特为1,因为此数字确实为负数。

一个负数的补码就是其对应的正数。以 -5为例,先求数字的反码:

再加一就是 -5的补码,也就是5。

简单来说,数字a(正负数皆可)的补码即为 -a。

若要计算n位数补码二进制对应的十进制,需要知道每位数对应的数字,除了最高比特外,其他比特的对应数字均和一般二进制相同,即第i位数表示数字2。但最高比特若为1时,其表示数字为 -2,因此若用此方式计算0000 0101表示的数字,其结果为:

有两个数字的补码等于本身:一个是0,另一个为该比特内可表示有符号位区分的二进制形式的最大负数(即1000...)。

0的补码计算方式(以8位为例)如下:先计算它的反码:

再将反码加一:

忽略溢出,其结果为0(0是唯一计算补码过程中会出现溢出的数字。)。因此0的补码为0。而0 x (-1) = 0,因此其补码仍满足“数字a的补码为 -a”的原则。

若计算1000 0000(这是8位内可表示有符号位区分的二进制形式的最大负数-128)的补码:先计算它的反码:

再加一就是它的补码。

1000 0000 (-128)的补码仍为1000 0000 (-128)。但(-128) x (-1) = 128,因此其补码是以上规则的例外。

总结:由于0可以等于0的二补数-0,以及同样因为8位的二补数可显示的值范围为 -128 ~ 127,但-128的二补数128无法用在已有比特数量为8的比特数量内的可用二补数表示。【在计算其他位数内的可表示有符号位区分的二进制形式的最大负数(即1000...000)时,也会有类似情形。】

所以:0和-128的确是“数字a的补码为 -a”原则中两个特别的数字。

另一种计算 N {displaystyle -N} 个可能的值,加减法运算都存在上溢出与下溢出的情况,实际上都等价于模2的加减法运算。这对于n比特无符号整数类型或是n比特有符号整数类型都同样适用。

例如,8位无符号整数的值的范围是0到255.因此4+254将上溢出,结果是2,即 ( 4 + 254 ) 258 2 ( mod 256 ) {displaystyle (4+254)equiv 258equiv 2{pmod {256}}} 即256为模,则

128 128 ( mod 256 ) 127 129 ( mod 256 ) 2 254 ( mod 256 ) 1 255 ( mod 256 ) {displaystyle {begin{aligned}-128&equiv 128{pmod {256}}\-127&equiv 129{pmod {256}}\vdots \-2&equiv 254{pmod {256}}\-1&equiv 255{pmod {256}}\end{aligned}}}

所以模256下的加减法,用0, 1, 2,…, 254,255表示其值,或者用−128, −127,…, −1, 0, 1, 2,…,127是完全等价的。−128与128,−127与129,…,−2与254,−1与255可以互换而加减法的结果不变。从而,把8位(octet)的高半部分(即二进制的1000 0000到1111 1111)解释为−128到−1,同样也实现了模256的加减法,而且所需要的CPU加法运算器的电路实现与8位无符号整数并无不同。

实际上对于8比特的存储单元,把它的取值解释为,或者,或者,或者,或者,甚至或者,对于加法硬件实现并无不同。

补码系统数字的加法和一般加法相同,而且在运算完成后就可以看出结果的正负号,不需特别的处理。

正数与负数相加不会出现上溢错误,因为它们的和一定会小于加数。上溢错误只有在两个正数或两个负数相加时才可能发生,这时候最高有效位(正负号)会变成相反。

以15加-5为例:

 11111 111(进位)  0000 1111 (15)+ 1111 1011 (-5)-----------------  0000 1010 (10)

由于加数和被加数都是8位,因此运算结果也限制在8位内。第8位相加后产生的进位不考虑(因为不存在第9比特)的1被忽略,所以其结果为10。而15 + (-5) = 10,计算结果正确。

在以上计算式中,可以由进位列的最左侧二个比特得知结果是否出现溢出。溢出就是数字的绝对值太大,以致于无法在指定的二进制比特个数来表示(在此例中,是超过8位的范围)。若进位列的最左侧二个比特同为0或同为1,表示结果正确,若是一个为0,另一个为1,表示出现溢出错误。也可以对此二个比特进行异或运算,结果为1时,表示出现溢出错误。以下以7 + 3的4位加法说明溢出错误的情形。

 0111(进位)  0111 (7)+ 0011 (3)------------  1010 (−6)  结果不正确!

在此例中,进位列的最左侧二个比特为01,因此出现溢出错误。溢出的原因是7 + 3的结果(10)超过补码系统4位所可以表示的数字范围 -8~7。

故为防止溢出错误,二补数在进行加法运算时通常将符号位进行复制后追加到最高位之前,即设二补数B的位数为WIDTH,则B′={B,B}。应注意此处B′的位数为WIDTH+1。如上两例用此方法进行计算:

  11 1111 111(进位)   0 0000 1111 (15)  +1 1111 1011 (-5)-------------------(1)0 0000 1010 (10)

由于WIDTH+1=8+1=9,故而第十位的1同样由于溢出而被省略,结果仍为10。两负数(符号位为1)相加时同理。

    111(进位)  0 0111 (7)+ 0 0011 (3)--------------  0 1010 (10)  结果正确!

由于WIDTH+1=4+1=5,故第五位的0仍为符号位,得结果正数10(十进制)。

减法通常转化为加法进行运算,将减数与被减数的补码进行加法运算,即可得出差。

乘法在电脑的世界里其实就是不断的做加法。

例如:3*5=3+3+3+3+3=15

除法就是相减。

例如:10/3=10-3-3-3=1mod3而减法又可做补码相加,所以所有四则运算的基础都是由加法而来。

相关

  • 爬虫类爬行纲(学名:Reptilia)动物通称爬行动物、爬行类、爬虫类,是一类脊椎动物,属于四足总纲的羊膜动物,是包括了龟、蛇、蜥蜴、鳄、鸟类及史前恐龙等物种的通称。本分类过去传统上包含
  • 朗罕氏巨细胞朗罕氏巨细胞(英语:Langhans giant cells,又称Pirogov-Langhans cells,也译作:langhans巨细胞、朗汉斯细胞)是在肉芽肿组织下发现的一类多核巨细胞。它体积大,胞浆宽,着粉红色,胞核从
  • 腱鞘囊肿腱鞘囊肿(ganglion cyst)是一种出现在关节或腱鞘上的肿块,内容物是液体。手腕背侧最容易发生腱鞘囊肿,其次是手腕的掌侧。腱鞘囊肿一般会持续一月以上。一般来说,腱鞘囊肿发生后
  • 拼图配件拼图配件(英语:Jigsaw Puzzle Accessories)是一个术语, 使用于描述拼图爱好者从事他们的兴趣时所使用的设备.拼图商品化可以追溯到1760年代的英格兰,由约翰·史皮尔斯布里起始。
  • ar (Unix)ar(archiver)是Unix系统上的归档工具,用于将多个文件归档为一个文件。ar目前一般仅被链接器用创建更新静态库和生成.deb包。它的归档功能现在基本被 tar所取代。 GNU Binutils
  • 海底总动员系列电影《海底总动员》(英语:)是由皮克斯动画工作室制作、华特迪士尼公司发行的美国计算机动画系列。《海底总动员》是第5部皮克斯动画电影。故事讲述一条名叫尼莫的小丑鱼被人类绑架
  • 阿什拉夫·马布比阿什拉夫·马布比(阿拉伯语:أشرف محبوبي‎,2000年8月8日-)是一名摩洛哥男子跆拳道运动员。他曾经获得2018年非洲跆拳道锦标赛男子74公斤级金牌及2019年非洲运动会跆拳
  • 排亚联盟排亚联盟(英语:Asiatic Exclusion League,简称:AEL)是一个在20世纪早期在美国及加拿大成立的组织,其目的是禁止来自东亚的移民。排亚联盟由67个工会于1905年5月14日在加州旧金山成
  • 蔡望怀蔡望怀(1938年9月-),男,祖籍福建南安,生于福建厦门,中华人民共和国政治人物,曾任厦门市人民政府副市长,厦门市政协主席,第九届全国政协委员,省人大第七届代表,省政协第七、八、九届委员。蔡望怀祖籍福建省南安县官桥镇漳里村,1938年生于厦门市。1955年,蔡望怀就读于北京石油学院,1960年毕业于厦门大学,分配到龙岩一中任教。1979年,调入厦门市教师进修学院。1984年起,历任厦门市人民政府副秘书长、教委主任、副市长。1993年至2002年12月,任厦门市政协主席、党组书记(1995年6月定级为副省
  • HD 40307 eHD 40307 e是一颗位于绘架座的太阳系外行星,母恒星是 HD 40307,距离地球约42光年。 该行星是英国赫特福德大学的天文学家米科·图米(Mikko Tuomi)和德国哥廷根大学的天文学家古勒姆·安格拉达-伊斯库德(Guillem Anglada-Escude)带领的团队以欧洲南方天文台的高精度径向速度行星搜索器发现。该行星的质量下限是地球的3.5倍,而动力学模型也指出它的质量不可能更高(因此该量测值相当接近边界值)。而进一部研究发现它从母恒星接受的辐射量相当于水星接受的辐射量,它被认为是超级地