Two's Complementの利点は何ですか?


11

一部のADC / DACデバイスでは、2の補数形式でデータを出力/入力するオプションがあります。

デジタルデータを2の補数形式で表現する利点は何ですか?単純なバイナリコードを使用して変換時間を節約できる場合


4
2つの賛辞ストレートバイナリコードです...
Mooing Duck

「代数は2の補数であるマシン(宇宙)上で実行され、」 - HAKMEM 154(inwap.com/pdp10/hbaker/hakmem/hacks.html
ChrisInEdmonton

2
5の2の補数とは何ですか?101.ストレートバイナリコードの5とは何ですか?101. -5の2の補数とは何ですか?1 ... 11111011。ストレートバイナリコードの-5とは何ですか?うう...
user253751

負の出力を持つADCを持つことはまれな特殊なケースのように思えますか?それは、測定された電圧が低電圧基準よりも低いことを意味しますか?そして、そのようなADCをどのように構築しますか?負の負荷を持つキャップを使用した逐次近似...?
ランディン

complEmentcomplImentの 2つの異なる単語があることに注意してください。ここでの主題は、それらの2つが非常に丁寧で、しばしばあなたについて良いことを言っているとしても、2の賛辞です。
ピートベッカー

回答:


11

符号付き整数の2の補数表現は、ハードウェアで簡単に操作できます。たとえば、否定(つまりx = -x)は、数値のすべてのビットを反転させて1を加算するだけで実行できます。ストリーム内の特定のビットを特別なものとして処理する必要があるため、生のバイナリで同じ操作を実行する(たとえば符号ビットを使用する)には、通常、より多くの作業が必要になります。加算についても同様です-負の数の加算操作は正の数の加算操作と同じであるため、負のケースを処理するために追加のロジック(しゃれなし)は必要ありません。

これはあなたの観点から見れば簡単なことを意味するわけではありませんが、このデータの消費者としては、デバイスの設計労力と複雑さを軽減し、おそらくそれをより安くします。


1
ビットを反転してから1を追加して無効にしますか?
スコットサイドマン14年

2
@ScottSeidmanはい、すみません、私はそのビットを忘れました。修正するために編集:)
多項式

1
実際、最大pickinessために、プロセッサに依存して、取るべき単一サイクルであってもよいX = X * -1、またはX - = 0をX、ための少なくとも2サイクル対X = 〜X + 1
マルクト

@marktはい。ただし、最小限のデバイス(つまり、フルプロセッサではない)のみを実装している場合は、シリコンの複雑さを最小限に抑えることは理にかなっています。
多項式14年

5
+1また、2の補数の2つだけを有する終わる(例えば、1の補数または符号ビットとして)0その他のために単一の値を有する
SBELL

5

ADCはデータを変換できます(たとえば、0〜5Vの入力電圧)。データは符号なし(0V = 0、5V = maxコード)または符号付き(2.5V = 0、0V = max -ve、5V = max)のいずれかが必要です。 + ve)。

署名付きデータの最も一般的なコンピューター表現である2の補数に加えて、上記の2つの形式間の変換は完全に簡単です。単にMSBを反転するだけです!

これは、ADCの内部ロジックに追加するのが非常に安く、ADCにデータシート上の別のセールスポイントを提供します...


ジャストは、以下のコメントとして2の補数とオフセット・バイナリ間のMSBスイッチを追加
スコット・サイドマン

3

負の数の表現で数学を実行する必要がある場合、2の補数を使用すると、「signed int」データ型と一致するオフセットバイナリよりも簡単になります。コンパイラーは、その対処方法を知っているだけです。それ以外の場合は、時計の刻みを前後に変換することに費やします。


1

質問では、ADCがストレートバイナリよりも2の補数形式で値を返すのに時間がかかることが暗示されているようです。これはADCの特定の実装の場合に当てはまりますが、一般的にはそうではありません(たとえば、MSP430シリーズのマイクロコントローラーには、値をストレートバイナリまたは2の補数で報告するADC周辺機器がオンチップで搭載されていますが、両方のケースで同じサイクル数を取ります)。

それが邪魔にならないように、2の補数とストレートバイナリのどちらを選択するかは、ほとんどの場合、トランスデューサの動作とデータの処理方法に依存します。

ストレートバイナリモードでは、ADCは測定されたアナログ量の大きさ(実質的に常に電圧)とフルスケールの基準量との比率を表す数値を提供します。たとえば、10ビットADCは0〜1023(両端を含む)の値を返すことができます。ADCの基準電圧(たとえば2.50ボルト)の半分である電圧(たとえば1.25ボルト)を測定すると、読み取るバイナリコードは読み取ることができる最大値の半分になります(つまり、512程度)。 ADCの丸めと非線形性の影響を受けます。

たとえば、タンク内のロケット燃料の量を報告するトランスデューサーがあるとします。0Vはタンクが空であることを意味し、2.5Vボルトは満杯であることを意味します。トランスデューサをADCに接続するだけで、すぐに使用できます!

ただし、上記の段落では、負の電圧を測定する方法はありません。タンクに出入りするロケット燃料の流れを測定したい場合(そして、それを行うためのトランスデューサーがあった場合)ADCは負の数を測定できないため、問題があります。ただし、2の補数モードを使用して簡単に偽造する方法があります。この場合、トランスデューサーの出力は、ゼロ点がADCの2つの基準電圧の中間になるように再バイアスされます。言い換えると、正のフローは1.25Vから2.50Vの電圧で表され、負のフローは1.25Vから0Vで表されるため、タンクへのフローは512から1023のADCコードを生成し、感謝の流れからのフローは511〜0のコード(ストレートバイナリ形式)。

今では非常に不便です。何かを行う前に、各測定値から512を差し引く必要があります。これにより、-512〜+511の範囲の数値が得られます。2の補数モードのポイントは、あなたのためにこれを行うということです!

ただし、符号付きの結果を生成するトランスデューサーでストレートバイナリを使用することもできます。たとえば、トランスデューサに差動出力がある場合があります。この場合、とにかく非反転出力から反転出力を減算する必要があるため、2の補数を使用する利点はありません。


1

2つの補数システムが使用されています。これは、単純なハードウェアが自然にどのように動作するかに起因するためです。例えば、ゼロにリセットした車の走行距離計を考えてください。次に、ギアをリバースに入れ、1マイル後方にドライブします(実際にはこれを行わないでください)。走行距離計(機械式の場合)は0000から9999まで回転します。2の補数システムは同様に動作します。

ここに画像の説明を入力してください


ここで新しい情報を実際に提供するのではなく、誰かが役立つと思われる走行距離計の例だけを提供していることに注意してください-若いときに2の補数システムの原理を理解するのに役立ちました。その後、加算器、減算器などが2の補数システムでうまく機能することを直感的に受け入れるのは簡単でした。

はい、私の日産の走行距離計はこのように機能します。


あなたの答えは、オーバーフロー(アンダーフロー)についてですが、走行距離計が負の数が表示されていないので、それはしないアドレスは何も2の補数関連の...
marcelm

@marcelm、実際、走行距離計の例 2の補数を説明しています。PkPが説明を十分に行っていないというだけです。6桁の走行距離計が0を読み取り、1マイル逆方向に走行すると、-1を読み取ると予想されます。代わりに、999999を読み取ります。これは、999999が-1の6桁の10の補数表現であるためです。
ソロモンスロー

@jameslargeいいえ、まだありません。実際には2の補数に触れるものは何もありません。または、補数、符号の大きさ、または符号付き数値表現。
marcelm

@marcelmはい、2の補数システムの中心的な考え方です。ゼロから1を引いたものが、表現可能な最大符号なし整数に等しくなります。それが2の補数システムの考え方です。これを提供する他の署名された番号表現はありません(私の知る限り)そして走行距離計の例は、この行動特性が工学の単純さからどれほど自然に由来するかを示しています。オドメーターの場合:機械工学から。機械的および電子的な世界の両方で、それ(2の補数システム)は、それを機能させる最も簡単な方法です。
PkP

0

他の人は、なぜ2の補数バイナリがコンピューターハードウェアに便利なのか、すでに答えています。ただし、A / Dが「ストレートバイナリ」ではなく2の補数を出力する理由を尋ねているようです(実際に何を意味していると思うにしても)。

ほとんどのA / Dは、0〜2 N -1の範囲の単純な符号なしバイナリ値を出力します。ここで、NはA / Dが変換するビット数です。これは2の補数表記と見なすこともできますが、値が負になることはありません。正数のみを扱う場合、ほとんどのバイナリ表現は同じです。これには、2の賛辞と符号の大きさが含まれます。

一部のA / D、特にマイクロコントローラに組み込まれているA / Dには、その範囲の下半分に負の値を生成するオプションがあります。これは、バイポーラ信号を測定するときに認識できる利点です。

少なくともマイクロコントローラーでは、これは一般に愚かなことです。場合によっては、変換せずにA / D値を直接使用できます。その場合、他のすべての値はすでにA / D範囲に変換されています。それをすべての非負数に制限すると、実際に物事が単純化されます。

それ以外の場合は、A / D読み取り値に何らかのスケーリングとオフセットを適用して、内部的に値に使用する単位にそれらを取得します。ここでも、A / Dから直接出力される符号なしの値にはマイナス面はありません。実際、スケーリングとオフセットを行う前に、通常、生の値にローパスフィルタリングを適用します。これらの値が負になることは決してないので、計算が少し簡単になります。符号なしの値でスケーリングを行うと、物事が少し簡単になることもあります。

符号なしの出力形式以外でA / Dを使用した100以上のマイクロコントローラープロジェクトで、1つのケースを思い出すことはできません。

A / Dが「2つの賛辞」を出力することの利点は何かという質問に答えるには、2つの答えがあります。

  1. とにかくそれらはすべて、ほとんどの場合これらの値が非負であるため、2の補数と符号の大きさなどの他の表記法の違いを知ることはできません。

  2. 利点はごくわずかです。マイクロコントローラー内では、本質的に存在しません。

    専用ハードウェアでは、負の値が負の入力電圧であることを示す利点があります。この場合、値の範囲を処理する最も簡単な方法は2の補数です。入力電圧範囲が0を中心に対称でない場合、この利点はなくなります。


-1

この「ストレートバイナリコード」とは何ですか?負の場合は '1'、正の場合は '0'(またはその逆)の符号ビットを持つことを意味すると仮定します。これには、まだ言及されていない2つの補数に対する2つの不利な点があります。1つは最近ほとんど関係がない、もう1つは重要です。

主に無関係なのは、1つ少ない数字、つまり8ビットで255の数字を表現できることです。これは、32ビットまたは64ビットを使用している場合はほとんど関係ありませんが、使用する4ビットまたは6ビットが少ない場合は問題になります。

もっと重要なのは、同じ数字を表す2つの方法があることです。具体的には、0-+0と-0ですが、+ 0と-0は同じ数字なので、実装ではこれらを比較しないことを確認する必要があります同等性チェックを行うたびに番号が付けられます。


あなたはここで軌道に乗っていないと思います。OPが符号なしのバイナリ表現についてはっきりと話していたとき、あなたは符号の大きさの表現について話していました。
ジョー・ハース

1
符号なし表現について話している場合、Twoの補数に利点はありません。それは単に少し無駄になります。
ジャックエイドリー14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.