二进制补码的优点是什么?


11

在某些ADC / DAC器件中,它们是以2的补码形式输出/输入数据的选项。

用二进制补码形式表示数字数据有什么优势?当您可以简单地使用直接的二进制代码并节省转换时间时?


4
Two的恭维直接的二进制代码……
Mooing Duck

“代数在作为二的补码的机器(宇宙)上运行”-HAKMEM 154(inwap.com/pdp10/hbaker/hakmem/hacks.html
ChrisInEdmonton,

2
五分之二的补码是多少?101.什么是直接二进制代码5?101.什么是-2的补数?1 ... 11111011。直接二进制代码中的-5是什么?呃...
user253751

具有负输出的ADC似乎是一种罕见的特殊情况?这意味着测量的电压低于低电压基准电压是什么意思?您将如何构建这样的ADC?用负载荷的瓶盖逐次逼近...?
隆丁

请注意,有两个不同的词,complEmentcomplIment。即使这两个人非常有礼貌并且经常对您说些好话,但这里的主题是两个人的称赞
皮特·贝克尔

Answers:


11

带符号整数的二进制补码表示很容易在硬件中操作。例如,取反(即x = -x)可以简单地通过翻转数字中的所有位并加一个来执行。在原始二进制文件中(例如使用符号位)执行相同的操作通常会涉及很多工作,因为您必须将流中的某些位视为特殊位。加法运算也一样-负数的加法运算与正数的加法运算相同,因此不需要其他逻辑(不需要双关语)来处理负数情况。

虽然这并不意味着从您的角度来看更容易,但作为此数据的使用者,它的确减轻了设备的设计工作量和复杂性,因此可能使其更便宜。


1
翻转位,然后加1取反,否?
Scott Seidman'3

2
@ScottSeidman是的,对不起,我忘了那一点。编辑修正:)
多项式2014年

1
实际上,对于最大pickiness,这取决于在所述处理器上它可以是单个周期取X = X * -1,或X = 0 - X,与至少两个周期为X = 〜X + 1
Markt的

@markt是的,但是如果您仅实现最小的设备(即,不是完整的处理器),则将硅的复杂性降低到最小是有意义的。
多项式2014年

5
1同样,二进制补仅具有用于0其它的单个值(如一个补码或符号位)最终具有两个
SBELL

5

ADC可以转换数据(例如,输入电压介于0至5V之间),并且您需要对数据进行无符号(0V = 0、5V = max代码)或有符号(2.5V = 0、0V = max -ve,5V = max) + ve)。

除了2的补码是用于签名数据的最通用的计算机表示形式之外,上述两种格式之间的转换也非常简单:只需反转MSB!

添加到ADC的内部逻辑中这是非常便宜的,并在数据表上为ADC提供了另一个卖点...


刚刚在二进制补码和偏移量二进制之间添加了MSB开关,如下所示
Scott Seidman 2014年

3

如果需要对负数的表示进行数学运算,则二进制补码比偏移二进制更容易实现,后者将与“ signed int”数据类型匹配。您的编译器将只知道如何处理它。否则,您会花费时钟滴答来回转换。


1

在该问题中,似乎暗示ADC以2的补码形式返回值所花费的时间要比直接二进制形式花费的时间更长。尽管在某些特定的ADC实现中可能会出现这种情况,但通常情况并非如此(例如MSP430系列微控制器的ADC外设片上器件将以直接二进制或2的补码形式报告该值,但实际上在两种情况下都需要相同数量的循环)。

这样一来,在2的补码和直接二进制之间的选择主要取决于换能器的工作方式以及您希望如何处理数据。

在直接二进制模式下,ADC为您提供一个数字,该数字表示所测量的模拟量(实际上始终为电压)的大小与满量程参考量之间的比率。例如,一个10位ADC可以返回0到1023(含)之间的值。如果您测量的电压(例如1.25伏)是ADC参考电压(例如2.50伏)的一半,那么您读取的二进制代码将是您可以读取的最大值的一半-因此,约为512,受ADC中的舍入和非线性影响。

例如,假设您有一个传感器,可以报告油箱中的火箭燃料量。0V表示油箱为空,而2.5V电压表示油箱已满。因此,您只需将换能器连接到ADC,然后就可以使用!

但是请注意,在上一段中,无法测量负电压。如果我们想测量火箭燃料进出油箱的流量(并且我们有一个传感器来测量)怎么办?ADC无法测量负数,因此我们遇到了问题。但是,有一种简单的方法可以使用2的补码模式来伪造它:在这种情况下,传感器输出被重新偏置,以使零点位于ADC的两个参考电压之间。换句话说,正向流量由1.25V至2.50V之间的电压表示,负向流量由1.25V至0V表示-因此流入储罐的ADC代码为512至1023,而流出的则表示感谢511到0(直接二进制格式)的代码。

现在这很不方便。在执行任何操作之前,我们必须从每次测量中减去512,这样得出的数字范围为-512至+511。2的补码模式的要点是它可以为您完成此操作!

但是,您仍然可能希望将直接二进制文件与产生带符号结果的换能器一起使用。例如,您的传感器可能具有差分输出:在这种情况下,您无论如何都要从非反相输出中减去反相输出,因此使用2的补码没有任何优势。


1

两者的互补系统正在使用中,因为它源于简单的硬件自然运行的方式。例如,以您的汽车的里程表为例,该里程表已重置为零。然后将齿轮倒档,并向后行驶1英里(实际上请不要这样做)。里程表(如果是机械的话)将从0000滚动到9999。两者的补码系统的行为类似。

在此处输入图片说明


请注意,在这里我并没有真正提供任何新信息,只是里程表示例可能会有所帮助-它帮助我了解了我年轻时二补码系统的原理。在那之后,我很容易直观地接受加法器,减法器等与两者的补码系统一起很好地工作。

是的,我的日产里程表确实以这种方式工作。


您的答案是关于上溢(和下溢)的,但由于里程表不显示负数,因此它无法解决与补码相关的任何事情……
marcelm

@marcelm,实际上,里程表示例确实解释了二进制补码。只是PkP的解释不够深入。如果六位里程表的读数为零,并且您反向行驶一英里,那么您希望它读数为-1。而是读取999999。这是因为999999是-1的六位十进制补码表示形式。
所罗门慢

@jameslarge不,它仍然没有。答案中没有任何东西可以真正触及两个人的补语。或一个人的补码或符号幅度或任何带符号的数字表示形式。
marcelm

@marcelm是的:二进制补码系统的核心思想是:零减去一等于最大可表示的无符号整数。这就是二进制补码系统的思想。据我所知,没有其他签名的数字表示形式提供此功能。里程表示例显示了这种行为特性很自然地来自于工程的简单性。就里程表而言:来自机械工程。在机械和电子领域,它(两者的补码系统)是使其工作最简单的方法。
PkP

0

其他人已经回答了为什么二进制补码对计算机硬件方便。但是,您似乎在问为什么A / D会输出二进制补码而不是“直接二进制”(无论您认为那是什么意思)。

大多数A / D确实会输出一个简单的无符号二进制值,范围是0到2 N -1,其中N是A / D转换成的位数。请注意,这也可以被视为二进制补码符号,只是值永远不会为负。如果仅处理正数,则大多数二进制表示形式都是相同的。这包括二进制补码和符号幅度。

一些A / D,特别是内置在微控制器中的A / D,可以选择为其范围的下半部分生成负值。在测量双极性信号时,这可能是一个明显的优势。

至少在微控制器中,这通常很愚蠢。在某些情况下,您可能无需任何转换就直接使用A / D值。在这种情况下,您已经将所有其他值转换为A / D范围。将其限制为所有非负数实际上可以简化事情。

否则,您将无论如何都要对A / D读数应用一定的缩放比例和偏移量,以使其成为内部用于值的任何单位。同样,直接从A / D出来的无符号值也没有不利之处。实际上,我通常在进行任何缩放和偏移之前对原始值进行一些低通滤波。知道这些值永远不会为负,会稍微简化计算。对无符号值进行缩放有时也会使事情变得简单一些。

我记不起100多个微控制器项目中的任何一种情况,在这些项目中,我以无符号输出格式使用A / D。

因此,要回答A / D输出“二进制恭维”的优点是什么,有两个答案:

  1. 无论如何,它们都会起作用,只是在大多数情况下,这些值都是非负的,因此您无法分辨出二进制补码和其他符号(例如符号幅度)之间的差异。

  2. 优点非常小。在微控制器内部,它们实际上是不存在的。

    在专用硬件中,具有负值指示负输入电压可能会有一些优势,在这种情况下,二进制补码是处理值范围的最简单方法。请注意,如果输入电压范围不对称于0,那么这种优势就消失了。


-1

您所说的“直接二进制代码”是什么?我假设您的意思是有一个符号位,负号为“ 1”,正号为“ 0”(反之亦然)。与二元补码相比,这有两个缺点,它们还没有被提及:一个在当今基本上无关紧要,另一个很重要。

基本上不相关的一个是您可以表示一个更少的数字-即8位中的255个数字。当您拥有32位或64位时,这是无关紧要的,但是当您只有4位或6位工作时,这很重要。

更为重要的是,现在有两种方法可以表示相同的数字-具体来说,0-+0和-0,但+0和-0是相同的数字,因此您的实现需要确保您没有比较这些数字每次进行相等性检查时都将数字编号。


我认为您不在这里。您正在谈论符号幅度表示,而OP显然是在谈论无符号二进制表示。
Joe Hass 2014年

1
如果您谈论的是无符号表示,那么Two的补码没有任何优势。只是浪费一点。
杰克·艾德利2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.