ホームページ  >  記事  >  なぜコンピューターでは負の数が 2 の補数で格納されるのでしょうか?

なぜコンピューターでは負の数が 2 の補数で格納されるのでしょうか?

青灯夜游
青灯夜游オリジナル
2020-12-08 10:34:4814063ブラウズ

コンピューターで負の数に 2 の補数記憶域を使用すると、基本的なコンピューター演算回路が簡略化されるため、加算と減算は加算回路で実装するだけで済み、減算の代わりに加算が使用されます。補数は負の数の最小の正の合同剰余であるため、負の数の加算と正の数の減算はどちらも補数を加算することで表現できます。

なぜコンピューターでは負の数が 2 の補数で格納されるのでしょうか?

このチュートリアルの動作環境: Windows 7 システム、Dell G3 コンピューター。

1. はじめに

整数がコンピューターにどのように格納されるか知っていますか?符号ビットと値ビットの合計ですか?値ビットは通常のバイナリ形式で格納されていますか?

最後の 2 つの質問に「はい」と答えると、3 ビット バイナリで格納され、符号ビット 0 が正を表し、1 が負を表す場合、1 は 001 として格納されることを意味します。 , -1 は 101 として格納されます。残念ながら、これは当てはまりません。コンピュータは、先ほどの自然な形式ではなく、2 の補数の形式で整数を保存します。2 の補数も符号ビットと値ビットで表されますが、表現規則は異なります。 1 は 001 として保存され、-1 は 111 として保存されます。

3 つの質問すべてに正解した場合は、コンピューターでは整数が 2 の補数形式で格納されることはわかりますが、なぜこの形式が使用されるか知っていますか?そして 「正の数の補数は元のコードに等しく、負の数の補数は補数に 1 を加えたものに等しく、その補数は元のコードの符号ビットに変更されずに等しく、残りはビットは反転されます。」 このような補数は何を意味しますか? 何を? (ご存知ない方は XD でお読みください)

まずは補数コードを使用する目的を見て、次に上記の補数コードの定義を忘れて、この目的から始めて本質を探ってみましょう。コードを段階的に補完します。
目的: 基本的なコンピュータ演算回路を簡略化するために、加算と減算は加算回路を介して実装するだけで済みます。つまり、 正の数を減算するか、負の数を加算します。 このような演算は次のように行うことができます。 代わりに正の数 を追加します。そこで、負の数の格納形式を変更し、正の数として直接加算できる形式に格納したものが補数符号です。 (正の数は変更する必要がないため、以下の説明では通常、正の数は省略されます)

2. 補数コードはどのようにして減算を加算に変換するのでしょうか?

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 に一致します。上記の式は時計の文字盤上にあり、時針上のこれらの操作の結果も同じであり、すべて同じ位置に設定されます。

n ビット バイナリで構成される計数システムは、オーバーフローした上位ビットを破棄するため、オーバーフロー可能な計数システムでもあり、その法は \(2^n\) です。 (0 から \(2^n -1\) まで数えると、それ以上はオーバーフローします)

3 ビット バイナリ モジュロ 8、
-2、-10、で構成されるカウント システムでは、次のように推測できます。 6、14は同じ2進数で表すことができ、10を引くと同時に14を足しても同じ結果になります。

2.2. 補数コードの導出

したがって、補数コードが負の数の正の合同剰余である限り、

加算を実行できます。この正の合同補数は、別の負の数を加算した場合と同じ結果になります。負の数の場合、条件を満たす正の合同式は無数に存在しますが、無駄な演算を減らすために、その中で最小の正の数を補数と指定することができます。 おそらく、元のコードから補数コードを見つけることが相補モジュロ演算であるため、補数コードと呼ばれます。

ここでの補数コードはすべて、私が特別なマークを付けていることに注意してください。これは、コンピュータに保存されている実際の補数形式ではないためです。補数と呼ぶべきですが、信じてください。とても近いです。

#3. 補完コードの改善

#3.1. この補完コード表現にはまだいくつかの問題があります

2 の補数に変換すると、数値の減算が加算になるので、とても良いように思えますが、数値自体の符号が失われるという明らかな問題があります。

たとえば、通常、3 桁の 2 進数は
0~7 を表します。補数法を使用すると、-8~-1 の演算を置き換えることができますが、真に表すことはできません。 -8~-1 は、正の数か負の数かわからないためです。 負の数値をコンピュータが計算しやすい形式に変換しましたが、数値としてのそれ自体の情報は失われてしまいました。

この問題を解決するにはどうすればよいですか? すぐに頭をたたいてしまう人もいるかもしれません。次に、プラスかマイナスかを示すために 1 桁足してください。でもこの場合計算するときはどうすればいいのでしょうか?2桁目から数えればいいのでしょうか?ビットを実行する際、符号ビットに影響を与えないように特別な注意を払う必要がありますか?問題はそれほど単純ではないことがわかるでしょう。

3.2. 補完コードの改善方法

ダニエルがどのようにしてこのアイデアを思いついたのかはわかりませんが、問題は解決されました完全に:

    補数コードの特性を維持することを前提とします (つまり、数値を引くと数値が加算されることになります)
  • 正と負の表現を増やす (できる)本当に
  • -8~-1 を表します。符号ビットが 0 か 1 かを見るだけです)
  • は、符号ビットを区別せずに、符号を直接扱って演算を行うこともできます。計算用の値ビットとしてのビットと、結果の正負の符号 この正負の表現は自然に準拠します (つまり、符号ビットの桁上げと値ビットの桁上げは自然に合理的になります)
そして、解決策は非常に細く、驚くほど単純です。つまり、前の「あなたが考えたアイデア:

正と負を示すために 1 桁追加します。」です。
具体的な方法は: 左側の高い位置に符号ビットを追加します。この符号ビットは、先ほど推定した擬似補数コードと合わせて、真に完璧な 補数コードを形成します。
達成された効果: 符号ビットを読み取ることで、数値の符号を知ることができると同時に、符号ビットは、数値ビットと同様に、演算、桁上げ、および実行に参加します。加算演算。

4. 最後に

要約

  • 補完コードを使用する目的: 基本的なコンピュータ操作を簡略化するためしたがって、加算と減算は加算回路で実装するだけでよく、減算の代わりに加算が使用されます。
  • なぜ補数コードがこの目的を達成できるのか: n ビット バイナリは、オーバーフロー可能な計数システムを形成できます。このようなシステムでは、計数システムの容量がモジュロとして使用され、すべてのモジュロはこれに合同です。数値はこの数え方システムで同じ表現を持ち、演算は同等です。補数は負の数の最小の正の合同剰余であるため、負の数の加算と正の数の減算はどちらも補数を加算することで表現できます。
  • 補数の計算方法: 正の数の補数はそれ自体です。負の数の場合は、最小の正の合同式 (値ビットの容量を法とする) を見つけて、それを次の値に代入します。符号位置が 1 である値ビットは、負の数の補数を取得します。
さらに関連記事を読みたい場合は、

PHP 中国語 Web サイト にアクセスしてください。 !

以上がなぜコンピューターでは負の数が 2 の補数で格納されるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。