有符号数处理

✍ dations ◷ 2025-01-11 14:26:23 #有符号数处理

在计算机运算中,有符号数的表示(英语:signed number representations)需要将负数编码为二进制形式。

在数学中,任意基数的负数都在最前面加上“−”符号来表示。然而在计算机硬件中,数字都以无符号的二进制形式表示,因此需要一种编码负号的方法。当前有四种方法,用于扩展二进制数字系统,来表示有符号数:原码(sign-and-magnitude)、反码(ones' complement)、补码(two's complement)以及移码(offset binary,excess-)。

符号及值(sign & magnitude)的处理办法是分配一个符号位(sign bit)来表示这个符号:设置这个位(通常为最高有效位)为表示一个正数,为表示一个负数。数字中的其它位指示数值(或者绝对值)。因此一个字节只有7位(除去符号位),数值的范围从0000000(0)到1111111(127)。这样当你增加一个符号位(第八位)后,可以表示从−12710到+12710的数字。这种表示法导致的结果就是可以有两种方式表示零,00000000(0)与10000000(−0),这大大增加数字电路的复杂性和设计难度。CPU亦须执行两次比较,来测试运算结果是否为零。

十进制数−43用原码方法编码成八位的结果为10101011。

这种方法被直接比较于常用的符号表示法(放置一个“+”或者“−”在数字的数值之前)。一些早期的二进制电脑(例如IBM 7090)使用这种表示法,也许是由于它与通用用途的自然联系。原码是最常用的表示浮点数的方法。IEEE二进制浮点数算术标准(IEEE 754)采用最高有效位作为符号位,因此可表示正负零及正负无限。

另一方面,一种叫做反码(ones' complement)的系统也可以用于表示负数(注:正数与原码形式一样,无需取反)。一个负数的二进制数反码形式为其绝对值部分按位取反(即符号位不变,其余各位按位取反)。同原码表示一样,0的反码表示形式也有两种:00000000(+0)与11111111(−0)。

举例来说,原码10101011(-43)的反码形式为11010100(−43)。有符号数用反码表示的范围为−(2N−1−1)到(2N−1−1),以及+/−0。一个惯常的八位的字节便是(可表示)−12710到+12710,以及00000000(+0)或者11111111(−0)。

对两个反码表示形式的数字做加法,首先需要进行常规的二进制加法,但还需要在和的基础上加上进位。为什么必须这样呢?来看下面这个−1加上+2的例子。

       二进制    十进制    11111110     -1 +  00000010     +2............    ...  1 00000000      0   <-- 错误答案           1     +1   <-- 加上进位............    ...    00000001      1   <-- 正确答案

在上面的例子中,二进制加法仅仅得到了00000000,这是一个错误的答案。只有当加上进位时才能得到正确答案(00000001)。

反码这种数字表示系统通常出现在老式的计算机中;PDP-1,CDC 160A,UNIVAC 1100/2200系列以及其它的一些电脑都使用反码算术。

关于正字法(orthography)的评述:这个系统之所以被称作反码(ones' complement)是因为一个正值的反(表示为按位非)也可以通过0的反码(ones' complement)表示形式(一长串的1,−0)减去得到。

Internet协议IPv4,ICMP,UDP以及TCP都使用同样的16位反码检验和算法。虽然大多数计算机缺少“循环进位”硬件,但是这种额外的复杂性是可以接受的,因为“对于所有位(bit)位置上的错误都是同样敏感的”。 在UDP中,全0表示省略了可选的检验和特性。另外一种表示:FFFF,指示了0的检验和。 (在IPv4中,TCP和ICMP都强制性地规定了检验和,而在IPv6中可以省略)。

注意负数的反码只需按位求数值的补码就可以得到,符号不需要变动。

补码(two's complement)回避了0有多种表示的问题以及循环进位的需要。在补码表示中,负数以位模式表示为正值的反码加1(当作无符号数)。

在补码表示中,只有一个0(00000000)。求一个数的补码(无论是负数还是正数)需要反转所有位,然后加1。一对补码整数相加等价于一对无符号数相加(除了溢出检测,如果能够做到的话)。比如,从旁边的表格可以看出,127与−128的补码表示相加就与无符号数127及128相加具有相同的结果。

从一个正数得到其对应负数的补码的简单方法表示如下:

移码(offset binary),是将二进制原码无符号整数所代表的值,减去一个预设值。

标准移码,预设值为二进制原码表示的最大整数的一半。 一个数的标准移码和补码,最高位相反,其余各位均相同。

下表列出了 4-bit 二进数所能表示的整数:

相关

  • 墨西拿期墨西拿期(英语:Messinian)是中新世的第六个阶段。其起止时间为7.246百万年前和5.333百万年前。
  • 三氯化钨三氯化钨是一种无机化合物,化学式为W6Cl18。它是一种八面体簇合物,为棕色固体,可由二氯化钨的氯化反应得到。这种簇合物有着12个双氯桥配体,其结构和铌或钽的氯化物类似。相比之
  • 张简修张简修(1561年4月15日-1620年11月17日),字嗣哲,号剑南,湖广江陵(今湖北江陵)人,明朝官员。首辅张居正四子,明神宗万历六年(1578年)以锦衣千户为指挥佥事。万历九年(1581年)由指挥佥事进同
  • 神鬼认证 (小说)《谍影重重》(英语:,台湾译《神鬼认证》)是一部1980年出版的惊悚小说,由美国由知名小说家劳勃·勒德伦写作。内容叙述一名失去记忆的男子-杰森·包恩,必须找到自己的记忆还有了解为
  • 罗肇唐家族裕泰兴家族,即是罗肇唐家族,成员包括:
  • 多德罗多德罗(加利西亚语:Dodro)是西班牙加利西亚自治区拉科鲁尼亚省的一个市镇。总面积约36km², 总人口2832人(2017年),人口密度78人/km²。教堂
  • 哈利亚拉 (市镇)哈利亚拉(爱沙尼亚语:Haljala vald)是爱沙尼亚西维鲁县的一个乡村型市镇。距首都塔林约80公里,行政中心为沃苏。面积为549平方公里,人口数量为4350人(2021年)。2017年爱沙尼亚行政改革后,原哈利亚拉市镇和维胡拉市镇合并成新的哈利亚拉市镇。新的市镇包括两个小镇和72个村庄。
  • 迈克尔·奥恩多卡迈克尔·卡塞·奥恩多卡(英语:Michael Kaase Aondoakaa,1962年6月12日-),尼日利亚贝努埃州人,尼日利亚政治人物,曾任尼日利亚总检察长兼司法部长(英语:Federal Ministry of Justice (Nigeria))。1962年6月12日,迈克尔·奥恩多卡在尼日利亚贝努埃州出生。他早年在马库尔迪的圣加布里埃尔山中学(英语:Mount Saint Gabriel's Secondary School)上学,毕业后被迈杜古里大学(英语:University of Mai
  • 劳塔罗·巴桑劳塔罗·巴桑(西班牙语:Lautaro Bazán,1996年2月24日-),阿根廷男子橄榄球运动员。他曾代表阿根廷七人制国家队参加2020年夏季奥林匹克运动会七人制橄榄球比赛,获得一枚铜牌。Template:2019年泛美运动会男子七人制橄榄球比赛阿根廷队阵容Template:2020年夏季奥林匹克运动会男子七人制橄榄球比赛阿根廷队阵容
  • 维尔纳·默尔德尔斯维尔纳·默尔德尔斯(德语:Werner Mölders,又译维尔纳·莫德士、威尔那·莫德士、威尔纳·莫德士、维纳·莫德斯、维纳·莫德尔斯,1913年3月18日-1941年11月22日)是第二次世界大战纳粹德国空军飞行员以及西班牙内战中知名的战斗机王牌飞行员,为人类航空史上第一位取得100次空战胜利者(即击落100架在空战中遭遇的敌机),并因其成就而被授予重勋,并协助德国空军发展出新式战斗机战术——四指队形,后来他在未驾驶飞机的情况下,死于一场空难之中。默尔德尔斯于1934年21岁时加入了德国空军。1938