コンピューターで負の数に 2 の補数記憶域を使用すると、基本的なコンピューター演算回路が簡略化されるため、加算と減算は加算回路で実装するだけで済み、減算の代わりに加算が使用されます。補数は負の数の最小の正の合同剰余であるため、負の数の加算と正の数の減算はどちらも補数を加算することで表現できます。
このチュートリアルの動作環境: Windows 7 システム、Dell G3 コンピューター。
整数がコンピューターにどのように格納されるか知っていますか?符号ビットと値ビットの合計ですか?値ビットは通常のバイナリ形式で格納されていますか?
最後の 2 つの質問に「はい」と答えると、3 ビット バイナリで格納され、符号ビット 0 が正を表し、1 が負を表す場合、1 は 001
として格納されることを意味します。 , -1 は 101
として格納されます。残念ながら、これは当てはまりません。コンピュータは、先ほどの自然な形式ではなく、2 の補数の形式で整数を保存します。2 の補数も符号ビットと値ビットで表されますが、表現規則は異なります。 1 は 001
として保存され、-1 は 111
として保存されます。
3 つの質問すべてに正解した場合は、コンピューターでは整数が 2 の補数形式で格納されることはわかりますが、なぜこの形式が使用されるか知っていますか?そして 「正の数の補数は元のコードに等しく、負の数の補数は補数に 1 を加えたものに等しく、その補数は元のコードの符号ビットに変更されずに等しく、残りはビットは反転されます。」 このような補数は何を意味しますか? 何を? (ご存知ない方は XD でお読みください)
まずは補数コードを使用する目的を見て、次に上記の補数コードの定義を忘れて、この目的から始めて本質を探ってみましょう。コードを段階的に補完します。
目的: 基本的なコンピュータ演算回路を簡略化するために、加算と減算は加算回路を介して実装するだけで済みます。つまり、 正の数を減算するか、負の数を加算します。 このような演算は次のように行うことができます。 代わりに正の数 を追加します。そこで、負の数の格納形式を変更し、正の数として直接加算できる形式に格納したものが補数符号です。 (正の数は変更する必要がないため、以下の説明では通常、正の数は省略されます)
2.1. 時計を使って減算から足し算を理解する
これはあなたの周りの例です。時計を校正するときは、時計が 6 時であることに気づいたとします。しかし、実際には今は 2 時しかありません。つまり、4 時間早く進んでいます。修正するには 2 つの方法があります。1 つは、時計を 4 時間戻すことです。反時計回りに 2 時まで時計を回す方法と、時計を 4 時間戻して 2 時まで戻す方法、時計回りに 6 時間ダイヤルして 12 時までダイヤルし、その後 2 時間ダイヤルする方法、つまり時計回りに 8 時間ダイヤルして時計を 2 時までダイヤルします。 2時。したがって、時計のダイヤルについて、-N
が反時計回りに N 時間回すことを意味し、N
が時計回りに N 時間回すことを意味すると仮定すると、-4 = 8
となります。 -1 = 11
、-5 = 7
、さらには -4 = 8 = 20 = 32 = -16
などもあります。 ..
ここにはどんなルールが隠されているのでしょうか?実際、数学では、-4、8、20、32、-16
は、特定の条件 (12 を法とする合同の場合) を満たす同じタイプの数値として分類できます。
中国語 Wiki での法と合同の定義は次のとおりです: 2 つの整数 a と b、それらを正の整数 m で割った余りが等しい場合、a と b は次のようになります。合同法 m 。オーバーフロー可能な計数システムでは、計数システムの容量を係数とすると、この係数に一致するすべての数値は、この計数システムで同じ表現になり、演算は同等となります。
たとえば、上の例の時計のダイヤルはオーバーフロー カウント システムであり、モジュロは 12 であるため、
-4、8、20、32、-16これらの数値はモジュロ 12 に一致します。上記の式は時計の文字盤上にあり、時針上のこれらの操作の結果も同じであり、すべて同じ位置に設定されます。
3 ビット バイナリ モジュロ 8、
-2、-10、で構成されるカウント システムでは、次のように推測できます。 6、14は同じ2進数で表すことができ、10を引くと同時に14を足しても同じ結果になります。
2.2. 補数コードの導出
したがって、補数コードが負の数の正の合同剰余である限り、加算を実行できます。この正の合同補数は、別の負の数を加算した場合と同じ結果になります。負の数の場合、条件を満たす正の合同式は無数に存在しますが、無駄な演算を減らすために、その中で最小の正の数を補数と指定することができます。 おそらく、元のコードから補数コードを見つけることが相補モジュロ演算であるため、補数コードと呼ばれます。
ここでの補数コードはすべて、私が特別なマークを付けていることに注意してください。これは、コンピュータに保存されている実際の補数形式ではないためです。補数と呼ぶべきですが、信じてください。とても近いです。#3.1. この補完コード表現にはまだいくつかの問題があります
2 の補数に変換すると、数値の減算が加算になるので、とても良いように思えますが、数値自体の符号が失われるという明らかな問題があります。 たとえば、通常、3 桁の 2 進数は
0~7 を表します。補数法を使用すると、
-8~-1 の演算を置き換えることができますが、真に表すことはできません。
-8~-1 は、正の数か負の数かわからないためです。
負の数値をコンピュータが計算しやすい形式に変換しましたが、数値としてのそれ自体の情報は失われてしまいました。
3.2. 補完コードの改善方法
ダニエルがどのようにしてこのアイデアを思いついたのかはわかりませんが、問題は解決されました完全に: を表します。符号ビットが 0 か 1 かを見るだけです)
正と負を示すために 1 桁追加します。」です。
具体的な方法は: 左側の高い位置に符号ビットを追加します。この符号ビットは、先ほど推定した擬似補数コードと合わせて、真に完璧な 補数コードを形成します。 。
達成された効果: 符号ビットを読み取ることで、数値の符号を知ることができると同時に、符号ビットは、数値ビットと同様に、演算、桁上げ、および実行に参加します。加算演算。
PHP 中国語 Web サイト にアクセスしてください。 !
以上がなぜコンピューターでは負の数が 2 の補数で格納されるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。