元のコード、逆コード、補完コード

転載:https//www.cnblogs.com/fangle/p/6816829.html

この記事は元のコードから始まります。元のコード、補完コード、補完コードの機能を簡単に説明することで、補完コードの理解を深めます。そして、あなたが概念を補完できるように努力することは、もはや以下に限定されません负数的补码等于反码加一

コンピュータまたは電子情報関連のコースに触れたことがある学生は、多かれ少なかれ補完コードを見ているは​​ずです。毎回、教科書の最初の数ページでそのような段落を思いついた:什么反码是原码除符号位,按位取反。补码等于反码加一。それから私はそれを不可解にそして混乱させて作り、そしてそれからページをめくった。とにかく、その背後にある内容は3ヤードとは何の関係もない。

何度か読んだ後、読んだことがありませんでした。古代人は言った:3つ以上のものはありません。C言語を学んでいたときに一度見ました。分かりませんか?「コンピュータ構成の基本原理」を読んで読んだのですが、まだわかりません!3年目までに、「シングルチップマイクロコンピューターの原理とインターフェース技術」をいつやっていたのか、まだわかりませんでした。学期の終わりに、レビュー中に、私は寮の人々とおしゃべりをしました。これらのコードについて話してください、私はあまり明確ではないと言いました。それから彼は計算中にコードを見つける方法を言いました。それで遊んで、私は突然理解しました。はい、やめて。言うまでもなく、私は休暇中に自分の考えを整理するので、私はこの量を持っています。ディスカッションの投稿を数えます。

よし、もういじめないで。オリジナルコード、インバースコード、補完コードの旅を始めましょう。

(1)予備知識

2進数、16進数を認識します。2進数と10進数の間で変換できます

コンピュータのハードウェア、コンピュータに保存されているデータ、本质都是以二进制码存储。

フォンノイマンによって提案された古典的なコンピュータアーキテクチャフレームワークによると。コンピュータは、算術演算装置、コントローラ、メモリ、入力および出力デバイスで構成されています。その中で、算術演算装置、加算演算装置のみ、減算演算装置はありません(最初はいくつかあったと言われていますが、減算器のハードウェアオーバーヘッドが大きすぎるために放棄されました)

したがって、计算机中的没法直接做减法的,它的减法是通过加法来实现的。現実の世界でのすべての減算も加算と見なすことができ、数値を減算することは、この数値を加算することの反対と見なすことができます。もちろんそうですが、前提は最初に負の数の概念を持つことです。これが、いまいましい符号ビットを導入する必要がある理由です。

而且从硬件的角度上看,只有正数加负数才算减法。
正数与正数相加,负数与负数相加,其实都可以通过加法器直接相加。

コンピュータが減算を行い、符号ビット(正と負の符号)を導入する問題を解決するために、元のコード、逆コード、および補数コードが生成されます。

この記事はかなり長いかもしれないので、一度に全部読む必要はありません。元のコード、逆コード、補足コード、章ごとに読みます。 
重要なのは補数について話すことです。補数に関しては少し混乱するかもしれません。ペンを持って2進数を一緒に書き出すことをお勧めします。

表現が明確で正確でない場合がありますので、ご容赦ください。 
(2)元のコード

元のコード:これは最も単純なマシン番号表現です。最上位ビットを使用して符号ビットを表し、「1」は負の符号を表し、「0」は正の符号を表します。他のビットは、数値の絶対2進値を格納します。

例として符号ビット付きの4桁の2進数を取り上げる場合

 1010  : 最高位为‘1’,表示这是一个负数,其他三位为‘010’,
      即(0*2^2)+(1*2^1)+(0*2^0)=2(‘^’表示幂运算符)
      所以1010表示十进制数(-2)。

次の図は、いくつかの正と負の数の2進数の元のコード表現を示しています。 
画像の説明
元のコード表現は非常に単純です。+ 0と-0が表示されますが、直感的で理解しやすいものはありますか。 
それで、私たちは喜んでコンピューティングを始めました。

0001+0010=0011    (1+2=3)OK
0000+1000=1000    (+0+(-0)=-0) 额,问题不大
0001+1001=1010    (1+(-1)=-2)

ああ、1+(-1)=-2これは私をからかっているようです。

したがって、正の数の間の加算は非常に単純な2進数の加算であるため、通常は間違いではないことがわかります。

正の数と負の数を加算するか、負の数と負の数を加算すると、不可解な結果が発生します。これはすべて、いまいましい符号ビットが原因です。0ポイント+0-0合計も彼によるものです。

したがって、元のコードは直感的で理解しやすいものですが、正の値に変換するのは簡単です。しかし、足し算と引き算を実現するには、操作規則が常に複雑すぎます。それで逆コードが来ました。

(3)逆コード

元のコードの最大の問題は、数値とその逆数がゼロに等しくないことです。

例えば:0001+1001=1010 (1+(-1)=-2) 0010+1010=1100 (2+(-2)=-4)

したがって、逆コードの設計アイデアは、この点を解決することを目的としています。負の数は正の数の反対であるため、正の数を使用してビットを逆にし、負の数を表します。

逆数コード:正の数の逆数コードは元のコードと同じです

負の数の逆数コードは、元のコードが符号ビットを除いてビットごとに反転されることです。

例として、符号ビット付きの4桁の2進数を取り上げます。

3是正数,反码与原码相同,则可以表示为0011
-3的原码是1011,符号位保持不变,低三位(011)按位取反得(100)
所以-3的反码为1100

次の図は、いくつかの正と負の数の2進数の補数表現を示しています 
画像の説明

上の図に直面して、元のコードの問題を逆コードで解決してみましょう。

0001 + 1110 = 1111(1 +(-1)=-0)

数値が互いに反対の場合、合計は0に等しく、解が解かれます。結果は1111ですが、-0です。

OK、もう一度2つの負の数を追加してみましょう

1110(-1)+1101(-2)= 1011(-4)

ああ、新しい問題があるようです

(-1)+(-2)=(-4)?

しかし、1011(-4の逆ですが、元のコードから判断すると、実際には-3です。偶然ですか?)なので、問題は大きくないようです。

別の例を見てみましょう

1110(-1)+1100(-3)= 1010(-5)

確かに偶然です。反対の数の問題は解決されたようですが、2つの負の数を加算するとエラーになります。

しかし実際には、2つの負の数を追加することは大きな問題ではありません。私たちの目的を振り返ってみましょう。引き算の問題を解決し、引き算を足し算として扱うことです。

2つの正の数の加算と2つの負の数の加算は実際には加算の問題ですが、符号なしビットがあります。そして、正の数+負の数は、実際の減算の問題です。

言い換えれば、正の数+負の数がうまくいかない限り、問題はありません。負の数に負の数を追加してもかまいません。負の数の本質は、正の数に符号ビットを追加することです。

元のコード表記では、2つの負の数を追加すると、実際にはオーバーフローが発生せず、結果は符号ビットエラーのみになります。(1001+1010=0011)

1の補数の負の数の加算は間違っていますが、大きな問題ではありません。2つの負の数の加算を実現するために加算するだけでよい場合は、符号ビットを含む2つの負の数の逆数を取り、それらをビットごとに加算してから、符号ビットを強制的に「1」に設定する必要があります。

したがって、逆コード表記は実際に減算の問題を解決しました.2つの反対の数の加算が元のコードのようにゼロではないように見えるだけでなく、次のような正の数と負の数の場合も同様です: 
0001(1)+1101(-2)=1110(-1) 計算結果は正しいです。したがって、元のコードと比較した逆コードの最大の利点は、減算の問題を解決することです。

しかし、0001+1110=1111 (1+(-1)=-0) なぜ-0それがなぜなの、私たちはまだ満足していません 

また、負の数を2つ加算することは大きな問題ではありませんが、大きな問題ではなく、問題でもあります。ええと、乙女座。次に、ビッグボスをご紹介します补码

(4)補完

補数:正の数の補数は元のコード 
に等しく、負の数の補数は補数+1に等しくなります。 
(これは補数を計算するための単なる方法です。ほとんどの本はこの文を補数として使用します)

「コンピュータ構成の原則」では、コードを補完するための別のアルゴリズムは次のとおりです。

負の数の補数は、低いものから高いものへと元のコードに等しく、仮数の最初の「1」と右側の「0」は変更されず、左側のビットはビットごとに反転され、符号はビットは変更されません。

OK、補足は終わりました。さようなら!

それはまだ説明できません。補数が補数に1を加えたものに等しいのはなぜですか?なぜそれが下位ビットから上位ビットに反転するのですか..................?

実際、上記の2つの段落は、コードを補完する方法にすぎず、補完するコードの定義ではありません。多くの人は、補体を求めることは最初に補体を求めることであると考えていますが、そうではありません。

それらの鶏泥棒のコンピューター科学者は、補数+1を気まぐれの補数として定義していません。只不过是补码正好就等于反码加1罢了。

したがって、これらの本の負の数の補数はその逆数に等しいことを忘れてください+1この文は私たちに誤解をもたらします。

これが、私が読んだ本「コンピュータ組織の原則」が最初に補数について、次に逆コードについて話さなければならない理由を後で理解した理由です。

次に、負の数の補数は、低いものから高いものへと元のコードに等しいと言われ、仮数の最初の「1」と右側の「0」は変更されず、左側のビットはビットによって反転されます。ビット、および符号ビットは変更されません。

しかし、上記の文も補語の定義ではなく、補語を見つける別の方法にすぎません。它的存在,告诉我们忘记那句该死的‘反码+1’它并不是必须的。

補語の厳密な用語を理解することに興味がある場合は、「コンピューター構成の原則」を読むことをお勧めします。「モジュラス」と「合同」の概念を使用して、補集合を厳密に説明します。

次に、補数のアイデアについて話したいだけです。

(5)補完のアイデア

コードを補完するというアイデアは、最初に見たときに非常に複雑に感じるかもしれませんが、立ち止まって考えてみると、間違いなく非常に素晴らしいと感じます。

コードを補完するというアイデアは実際には人生から来ていますが、私たちはそれに気づいていません。時計、緯度と経度、易経のゴシップ。

コードを補完するという考えは、実際には人生の時計に似ています

まあ、私は実際にはこのような似たような言葉を使いたくありません。なぜなら、類推は結局のところそれ自体ではないからです。そして、厳格さの欠如は、私が厳格であったかのように、私がエンジニアリング僧ではないことを疑わせます、ハハ

時針が10時に止まるとしたら、時針はいつ8時に止まりますか?

簡単に言えば、過去2時間の8時でした。次の10時間で8時になります

つまり、時刻は10時間に設定され、2時間は8時に設定されます。

つまり、10-2 = 8、および10 + 10 = 8(10 + 10 = 10 + 2 + 8 = 12 + 8 = 8)

このとき、時針が2周目を歩いていて、さらに8時間歩いているので、時針は8時に止まりました。

したがって、12はクロック計算ではモジュラスと呼ばれます。12を超えると、再び1からカウントされます。

言い換えれば、10-2と10 + 10は別の観点からは同等であり、どちらも時針を8時位置にします。

同等であるため、クロック動作では、数値を減算することは、実際には別の数値を加算することと同等です(この数値の加算と減算は、合同数とも呼ばれる12に正確に等しくなります)。

これは、補数のいわゆるモジュラー算術思考の実例です。

ここでも强调原码,反码,补码的引入是为了解决做减法的问题。、元のコードである1の補数表記で、減算を加算に変換するという考えは、数値を減算することです。これは、数値の反対の数値を加算することと同じです。その結果、符号ビットは次のようになります。導入されましたが、サインビットが発生しました。あらゆる種類の予期しない質問。

しかし、上記の例から、数値が実際に減算されていることがわかります。对于数值有限制,有溢出的运算(模运算)来说,其实也相当于加上这个数的同余数。

言い換えれば、私たちは不引入负数的概念,就可以把减法当成加法来算次に、4ビットの2進数の操作について説明します。急いで符号ビットを導入する必要はありません。のため补码的思想,把减法当成加法时并不是必须要引入符号位的

そして、次の例で別の質問に答えることができます。为什么负数的符号位是‘1’,而不是正数的符号位是‘1’。

(6)補完的なコード例

さて、2進数の4桁の減算を実行しましょう(符号ビットを導入せずに)

0110(6)-0010(2)[6-2 = 4ですが、コンピューターに減算器がないため、計算できません]

このとき、時計の動作を考えます。数値を引くことは、別の正の数(合同数)を加えることと同じです。

それで、この数は何ですか?クロックの計算から、この数値の加算と減算がモジュラスに正確に等しいことがわかります。

では、4桁の2進数の絶対値は何ですか?つまり、4桁の2進数の最大容量はどれくらいですか?其实就是2^4=16=10000B

その場合、2の合同は10000-0010 = 1110(14)に等しくなります。

その場合

0110(6)-0010(2)= 0110(6)+1110(14)= 10100(20 = 16 + 4)

OK、このアルゴリズムに従って得られた結果は10100ですが、4桁の2進数の場合、最大値は4桁しか格納できません(ハードウェアによって決定されます)。4桁を下げる0100(4)と、たまたま次の結果になります。最高の位置‘1’については、コンピュータがpsw寄存器进位位中。8ビットマシンに配置してcy中央に配置し、x86をcf中央に配置します(これについては説明しません)。

現時点では、4桁の2進数でもう一度考えてみましょう。2を引くことは、合同14を加えることと同じです(合同である理由については、「コンピューター構成の原則」を読むことをお勧めします)。

しかし2、別の観点から、減算は、を加算することでもあり(-2)ます。つまり加算(-2)と加算14によって得られるバイナリ結果は、キャリービットを除いて同じです。

1110(14)最上位ビットを符号ビットの(-2)補数と見なす場合、これが負の数の符号ビットが‘1’そう‘0’ない理由である可能性があります

さらに、‘-8~7’符号付きビットを含む4ビットの2進数では(14)表現できるのは符号なしビットの機能だけであり、符号付き数値の効果(-2)は実際には同じです。

正の数の補数はどうですか?正の数を加算すると、加算器を直接実装できます。したがって、その補集合はまだそれ自体です。

次の図は、符号付き4ビットバイナリの2の補数表現を示しています。 
画像の説明

この時点で、元のコードと逆コード、補完コードの問題は基本的に解決されていることがわかりました。

補数に負のゼロはありません、因为1000表示-8

これは、上記の補数図によれば、減算0001(1)+1111(-1)=0000 
行う場合、それ1000を表す负0ために減算行う必要がなくなったため、次のように定義します。-8

負の数に負の数を追加する問題も解決されます1111(-1)+1110(-2)=1101(-3)

少し複雑かもしれませんが、実際には方法がありません。実際、補完コードはまだこのように描くことができると思います。 
画像の説明

地理の教科書を考えると、0は元の子午線と同等ではなく、-8は180°ではなく、正の数は西経に相当し、負の数は東経に相当します。

(7)なぜこのように補集合を求めるのですか

次に、負の数の補数が1の補数+1である理由を見てみましょう。

負の数の逆数にこの負の数の絶対値を加えたものは、1111に1を加えたものに正確に等しいため、4桁の2進数の係数である1000になります。

負の数の補数は、その絶対値の合同であり、係数から負の数の絶対値を引くことによって取得できます。

したがって、負の数の補数はその補数+1です。

少し複雑ですが、はっきりと理解するのは難しいとしか言​​えないので、自分で理解する必要があります。私が上で述べた別のアルゴリズムがあります。

次に、補数を計算するための私自身のヒントについて話したいと思います。

上の写真を見てください。

-8を負の数の起源と見なす場合。では、-5の補数は何ですか?

-5=-8+3

-5の補数は-8の補数に3を加えたものです

1000(-8) +0011(3)=1011(-5)

口で計算できるので-5的补码是1011

もちろん、-1的补码是1111口頭の算数から引くことを忘れないでください。

8ビット加算器の場合、これ-128は補数の原点と見なすことができます-32768補数の原点として16ビットを使用できます

はい、それ1282568ビットの2進数のモジュラス)の半分3276865536(16ビットの2進数のモジュラス)の半分です。

持っているのもとても便利で、シンプルです

補数コードの原点は常に最上位ビット‘1’であり、他のビットは‘0’

したがって、加算を行うことは常に計算が簡単です。

OK、元のコード、逆コード、および補完コードの旅はここで終わります。補完コードは、最初に見たときは常に非常に複雑に感じます。簡潔で簡潔にしたい場合は、何かが足りないのではないかと心配しています。詳細に言えば、私でも冗長に感じることは避けられません。ありがとうございました!

おすすめ

転載: blog.csdn.net/modi000/article/details/113529336