元のコードの補完コードシフトの目的

固定小数点および浮動小数点演算は含まれません。範囲は整数のデータ表現のみです。

比喩を使用し、同様の考え方を使用して共通点を理解します。これが私がこの記事を書きたいものです。
計算方法を設計し、その考え方と目的を研究の中心に据えています。
Tang Shuofeiの教科書は私のIQを過大評価しています。小数が出て、補数はすべて抽象的な計算です。いくつかの例はありません(これ、初心者向けの教科書ですか?)......


最初に8ビットの2進数を使用して値を表します

真理値 元のコード 補数コード(負の数の場合、補数コード+1) 反転コード(負の場合、元のコードは符号ビットを除いて反転されます) シフトコード(補完コード符号ビットコピーリバース)
-5 1,000 0101 1,111 1011 1,111 1010 0,111 1011
+5 0,000 0101 0,000 0101 0,000 0101 1,000 0101

「コンマ」は符号ビットを他のビットと区別するために使用され、実際には存在しないことに注意してください。


解決すべきいくつかの問題を明確に提示する

1.符号ビットが演算に参加します
2.すべての減算演算を追加する必要があります
3.限られたストレージビット

問題解決の原理1-マッピング
[-128、127]から[0、255]へのマッピングは手動で指定されるため、「正の数のみが負の数を表す」
と、次のようなマッピング(シフトコード)を指定できます。直接比較しやすいサイズ指定が可能サイズ比較。

問題2と3を解く原理モジュロ演算
モジュラスが「補数」になった後、マッピングを追加した後、対応する正と負の数に対応します。
モジュラス自体は一種の桁制限です。

角度の数と同様に、
同じ円内で60°= -300°、モジュロ演算。モジュラスは360です。(0から359までの整数の範囲で、360 = 0として計算されます)
1バイト8ビット符号ビットの7桁、
1111 1111 = 0000 0000、モジュロ演算を除いて、ここではモジュラスは1 0000 0000です(このモジュラスを超える数はありません。10進数で特定の桁を見たことがありますか?)

比較のために別の表を置く

コード 元のコードで表される真の値(符号なしビット) 元のコードで表される真の値(符号付きビット) 補数コードで表される真の値(+1を否定する人は「コード」です)
1111 1111 255 -127 元のコード10000001、つまり-1

この表現方法を設計する目的(問題に遭遇する、ツールを発明する、問題を解決する)

真理値

数値
3(10進数)を与える-真の値

符号なし2進数

3(10進数)をバイナリ
0011として表します-符号なし2進数

元のコード

しかし、サインを考慮する必要がある場合はどうすればよいですか?最上位ビットを符号ビットとして使用してください。
0,011-元のコード
Aha、負の3(10進数)は1,011-
元のコード

補体

5(10進数)-3(10進数)をカウントしたい場合はどうなりますか?
0,101
1,011
これらの2つの数値を直接操作して、結果を取得することはできません。
マッピングが与えられると、正の数はそれ自体であり、負の数はモジュロです!負の数とそのモジュロ値を10000に等しくします。-[-8、7]から[0、15]へのマッピングを実現します
(モジュラスは、10進モジュラスが10であるなど、最上位ビットより1ビット大きいため、1ビットが10以上になることはありません)

補足コード(ビットで反転して1を追加する理由)
私はこのブロガーの文章が好きです-「必要なのは1 + 1 = 2ではないのに、1 +1が2に等しい理由です。もちろん問題については説明しません。 1 + 1の我々は補体を議論している。」
このブログのサマリー作成[正数+(逆符号+1)= 0、負の数=(逆符号+1)]
-thinkので、正の数自体のマッピング負の数は最初にすべてのビット(符号ビットを含む)を反転し、
次に、たとえば、0010(+2)の逆コードは1101であり、各ビットが反転さ
れるため、正の数を作成するために結果は1111になります。負の数を追加すると「0になります」、1を追加して1 0000になり、係数は0000になります。つまり、「反対の数はゼロに追加されます」

このようにして得られた3(10進数)から10000のモジュロ値= 10000-1011 =
001010,101
符号ビットは負の値[10000 = 1111 + 1、「負の+1」と見なすことができます]
1,101-補数

6(10進数)-3(10進数)は
0,110
1,101で、
合計は10011であり、1 0000のモジュラスは0011です(これは正の補数であり、正の補数は元のコードと同じです)。
0,011-計算結果の元のコード(+3)

1(10進数)-3(10進数)は
0,001
1,101の
合計で1110になり、10000を法とするものは1110(負の補数)になります。[1の補数の計算は10011の補数のままです。元のコードが負の場合、「1を減算して否定」する必要があります]
1110から「1を減算」は1101を取得し、「
neg 」は1,0101,010を取得できます-計算結果元のコード(-2)

フレームシフト

元のコードを比較すると、
0,011(+3)、
1,010(-2)は
符号なしの2進数として表されます。0011(
3)
1010(10)
は明らかに不合理です。
境界値が指定されている場合、次のようになります。 1で始まる数はすべて負の数であると判断されました。0で始まるすべての数は整数です-変更するだけですか?1011-
+ 3シフトコード
0010--2シフトコード
このように、元のコードを符号なし2進数にマッピングすることは合理的です。


栄養:

抜粋:元のコード、逆コード、および補完コードの生成、アプリケーション、長所と短所は何ですか?-彼Xinyu
補集合の起源の説明は、次のように要約できます
。1。コンピューターには、加算器のみがあり、減算器はありません。すべての減算演算は、加算によって実行する必要があります
2.元の数値の代わりに補数を使用して、減算を加算に変換します。
3.表示されるキャリーはモジュラスであり、この時点でのキャリーは無視する必要があります。
4.バイナリシステムでは、操作に関係する桁数であり、モジュラスは1の後に追加される0の数です。
補数はこの要件に従って定義されます。正の数は変更されないままで、負の数はモジュロマイナス絶対値です。

抜粋:元のコード、逆コード、および補完コードの生成、アプリケーション、長所と短所は何ですか?-張天興

いわゆる元のコードは、符号ビットが追加された2進数であるマシン番号です。正の数の符号ビットは0で、負の数の符号ビットは1です。データの保存、処理、および計算コンピュータでは通常、8ビット、16ビット、および32ビットです。または64ビットの場合、これが最も簡単な8ビットの説明です。符号ビットは8ビットの1つであるため、直感的に読み取れる数は7つだけです(最後の7桁だけが重みで拡張できます)。元のコードに欠陥があることに気付く人がいるかもしれません。00000000(+0)と10000000(-0)は実際には同じ番号であるため、255の状態しか表すことができず、元のコードの範囲は-127〜 +127になっています。これは問題です。補数の-128を表すために10000000が使用されるため、これを解決するには魔法の補数が必要です。
いわゆる1の補数は、英語では1の補数とも呼ばれます。ここでの1は、基本的に有限桁のカウントシステムで表すことができる最大値です。8ビットのバイナリでは、1ビットである11111111です。 10進数で9、3桁の16進数でFFFです。否定は1の補数とも呼ばれ、最大数から数を引くことで否定を得ることができます。バイナリの11111111から任意の数を引くことは、この数のビット単位の否定であり、0が変更されていることが簡単にわかります。 1、1はゼロになるので、逆コードと呼ばれます。元のコードを否定する方法は、正の数は変更されず、負の数は符号ビット1を変更せずに保持し、残りのビットはビットごとに反転されます。
いわゆる補数は、英語では2の補数とも呼ばれます。この2は、カウントシステムの容量(モジュラス)を表します。これは、カウントシステムが表すことができる状態の数です。1ビットの2進数の場合、状態は0と1の2つしかないため、モジュラスは10(10進数で2)であり、7ビットの2進数の場合は10000000です。このモジュラスは取得できません。桁数はもう1つです。モジュラスから数値(符号なし部分)を減算して、この数値の補数を取得します。たとえば、10000000-1010010 = 0101110です。実際、10000000 = 1111111 + 1であるため、わずかな変化は(1111111-1010010)+1になります。また、最初に否定してから1を加算することとして表現することもできます。補数を合計する方法は、正の数は変更されず、負の数は符号ビットを保持し、1の補数が最初に追加されるというものです。
1の補数を見つける方法を覚えておいて、計算について話しましょう。元のコードの符号ビットと値を使用して、それが表す数値をすばやく指摘し、正と負を判断して4つの算術演算を実行できます。対照的に、逆数コードと補数コードは人にはわかりにくいものです。元のコードが人間のデジタル言語である場合、補数はコンピューターのデジタル言語です。コンピュータは、何が正で何が負であるか、サイズを知る必要はありません。これらの判断は複雑すぎます。実際、保存、処理、送信される数値には、補体の形式が1つしかありません。人間が行った加算、減算、乗算、除算は、コンピューターで加算およびシフトすることで解決できます。これは、補体の固有の自由に由来します。システム。Qiaheの独創的な技量の魔法の力も次の記事の焦点です。
加算と減算は、上記の方法で補数を取得した後、直接加算できますが、加算時の演算には符号ビットが関与している必要があり、2つの符号ビットが加算されたり、下位ビットからの桁上げが行われたりする場合があります。オーバーフローが発生した場合は、オーバーフローしたビットを破棄し(理由は後で説明します)、新しい符号ビットが結果の符号を決定します。0が正の場合、結果は元のコード、1が負の場合、結果です。元のコードを取得するには、補数を見つける必要があります。

抜粋:補数コードは128に対応します
。負の数は補数コードで表され、実際には[-128、127]から[0、255]へのマッピングを実装します。次のように:

+----------------------------+
| 255     -1       11111111  |
| 254     -2       11111110  |
| 246     -10      11110110  |
| 156     -100     10011100  |
| 129     -127     10000001  |
| 128     -128     10000000  |
| 127      127     01111111  |
| 100      100     01100100  |
| 10       10      00001010  |
| 2        2       00000010  |
| 1        1       00000001  |
| 0        0       00000000  |
+----------------------------+

おすすめ

転載: blog.csdn.net/sinat_27382047/article/details/105916458