機械番号、真値、原コード、補数コード、補数コード

マシンの数

マシン番号は、コンピュータにおける数値の 2 進数表現です。機械語には 2 つの特徴があります。1 つはシンボルのデジタル化であり、もう 1 つは数字のサイズが機械語の長さによって制限されることです。
マシン番号は署名付きまたは未署名の場合があります。符号付きマシン番号は、正の数、負の数、ゼロを表すために使用されますが、符号なしのマシン番号は非負の整数のみを表すことができます。コンピューターでは、算術演算を実行してデータを表現するために、符号付きマシン番号が一般的に使用されます。ただし、ビット単位の演算を実行したりバイナリ データを処理したりする場合など、符号なしマシン番号が使用される状況があります。
符号はコンピュータが使用するマシン番号の最上位ビットに格納されており、正の数は 0、負の数は 1 です。例えば、10進法で数字+3、コンピュータの語長は8ビット、2進法に変換すると0000 0011となります。-3 の場合は 100 00011 になります。つまり、ここの 0000 0011 と 1000 0011 はマシン番号です。
元のコード、補完コード、および補完コードはすべて機械番号の形式に属します。

真理値

機械番号の真理値は、それが表す実際の数値です。符号なしマシン番号の場合、その真理値はそれ自体です。符号付きマシン番号の場合、その真理値はその表現に基づいて計算する必要があります。
たとえば、符号付き数値 1000 0011 は、その最上位ビット 1 が負を表し、実際の値は -3 です。

元のコード

最初のビットはシンボルを表し、残りのビットは値を表します。最初のビットが符号ビットであるため、8 ビット 2 進数の値の範囲は [1111_1111, 0111_1111]、つまり [-127, 127] となります。元のコードは人間が理解しやすい表現です。脳。

8 ビットの 2 進数の値の範囲は 00000000 (0) ~ 11111111 (255) で、最上位ビットは正負を示す符号ビットです。2 の補数表記を使用する場合、値の範囲は 10000000 (-128) ~ 01111111 (+127) です。

一般的に言われる 8 ビットの符号付き 2 進数の値の範囲は 10000000 (-128) ~ 01111111 (+127) で、最上位ビットは正負を示す符号ビットです。この範囲は 2 の補数表記に基づいて計算されます。

逆コード

正の数の 1 の補数はそれ自体であり、負の数の 1 の補数は符号ビットを変更せずに残りのビットを反転します。
たとえば、正の数 1 の元のコードは [0000_0001]、その補数は [0000_0001]、-
1 の元のコードは [1000_0001]、その補数は [1111_1110]

補体

正の数の補数はそれ自体であり、負の数の補数はその補数に基づいて +1 になります。たとえば、正の数
1 の元のコードは [0000_0001] で、その補数はそれ自体 [0000_0001]、
- 1. 補数は [1111_1111]

8 ビット 2 進法では、-128 は元のコードまたは補数コードで表すことができません。元のコードと補数コードは 0 ~ 127、-0 ~ -127 のみを表現できます。補数コードには正の区別はありません。 0 と負の 0、[-0] 補数コードの最初の 1 は符号ビット、仮数部の 7 つの 1 は数値ビットです。仮数に 1 を加算した後、数値ビット 1111 1111 でキャリーが発生します。 +1=1 0000 0000 (補数を計算するプロセスでは、最初のビットが変更されないことを確認しますが、符号ビットが変更されないことを確認し、補数ルールが補数コードに 1 を追加することを確認します)全体として)。したがって、補数コードが表現できる数値の数は元のコードの補数コードより 1 つ少なくなり、補数コードは真の値が -128 であるもう 1 つの数値を表現できます。

10進数 元のコード 逆コード 補体
-128 1000 0000(範囲外、キャリー四捨五入) 1111 1111 (元のコードが範囲を超えています) 1000 0000 (±0 の補数は同じで、負の数は 1 つ多い値を表すことができます)
-127 1111 1111 1000 0000 1000 0001
-2 1000 0010 1111 1101 1111 1110
-1 1000 0001 1111 1110 1111 1111
-0 1000 0000 1111 1111 0000 0000
+0 0000 0000 0000 0000 0000 0000
1 0000 0001 0000 0001 0000 0001
2 0000 0010 0000 0010 0000 0010
126 0111 1110 0111 1110 0111 1110
127 0111 1111 0111 1111 0111 1111

このうち、ソースコードと正の数の補数コードは同じですが、負の数の補数コードはソースコード内の全ビットを反転(0が1になる、1が0になる)しており、補数コードは補数コードに 1 を加えます。符号付き整数の場合、最上位ビットは符号ビットであり、0 は正の数を表し、1 は負の数を表すことに注意してください。したがって、0 の 2 の補数は 10000000 ではなく、00000000 になります。

n ビットの符号付き数値の 2 の補数の値の範囲は -2^(n-1) ~ 2^(n-1)-1 です。

コンピューターでは、符号付き数値の加算および減算演算は 2 の補数コードを使用して実行されます。

-128 の由来:最上位ビットは符号ビットなので、残りの 7 ビットは 0 ~ 127 を表し、-127 から 127 まで表現できます。+0 と -0 は両方とも 0 を表すため、それらが繰り返されます。負の数を表すために追加のビットがあります8 ビットの補数表現の場合、最大値は 01111111 (+127)、最小値は 10000000 (-128) で、-0 の値は存在しません。

一部の特定のアプリケーション シナリオでは、10000000 が -0 として解釈される場合がありますが、これは補数の標準的な定義ではありません。実際のプログラミングでは、混乱やエラーを避けるために、-0 などの非標準的な表現方法は避けてください。

元のコードがあるのに、なぜ逆コードや補コードを使用する必要があるのでしょうか?

人間の脳は最初のビットが符号ビットであると認識できるので、符号ビットに基づいて真の値の絶対値を加算、減算、乗算、除算することができますが、コンピュータの場合、加算、減算、乗算、除算はコンピュータの符号ビットを識別する能力はコンピュータ回路の設計を非常に複雑にするため、人々は計算に符号ビットを含めるというアイデアを思いつきました。 。数値を減算することは、その負の数値を加算することと同じです。

オリジナルコードのパラメータ操作を使用する場合の欠点

ここに画像の説明を挿入します

上の元のコード表から、左側の追加の各バイナリ単位に対応する実数が減少しているのに対し、右側の追加の各バイナリ単位に対応する実数が増加していることがわかります。したがって、元のコードでは、次のようになります。正の数の加算は満たしますが、負の数の加算は満たせません

2+1 = [0000_0010]原+[0000_0001]原=[0000_0011]原 = 3

1+(-1)=[0000_00001]原+[1000_0001]原=[1000_0010]原=-2

負の数を加算するニーズを満たすには、負の数とそれに対応する 2 進コードを同期して増加または減少させる必要があります。

したがって、符号ビットは変更されず、同期インクリメントまたはデクリメントの要件を満たすために残りのビットが反転されます。正の数は本質的にそれ自体の加算を満たすため、変更は必要ありません。これが反転の定義の由来です。
ここに画像の説明を挿入します
上図の補数テーブルから、演算が 0 を越えない場合、正と負の数の加算はすでに要件を満たしていることがわかります。

-2+1=[1111_1101]リバース+[0000_0001]リバース=[1111_1110]リバース=-1

127+1=[1000_0000]逆数=-127=128 加算計算は128です。128は最大値を超えているので余りは1なので、最小値から始まる最初の桁が取られます。

最小値は -127 ですが、ここで無理があり、[1111_1111] と [0000_0000] は両方とも 0 を表すため、実際の計算では 0 をまたぐたびに 1 単位の誤差が発生します。

-1+2=[1111_1110]リバース+[0000_0010]リバース=[0000_0000]リバース=0

この問題を解決するには、補数コードの [1111_1111] と [0000_0000] をマージする必要があります。

[1111_1111]+[0000_0001]=[0000_0000] であるため、負の数の補数に 1 を追加すると、補数で 0 と交差するエラーの問題を解決できます。同時に、負の数とそれに対応する 2 進の補数は問題を解決できません。インパクトがあるので、補数コードに基づいて +1 することでバジェットへのシンボル参加の問題を完全に解決します これが、補数コードが負の補数コードに基づいて +1 される由来です。
ここに画像の説明を挿入します

上の図から、実数に対応しない別の 2 進数 [1000_0000] があることがわかり、この数値の実数は -128 であると規定しました。

したがって、補数符号の表現範囲は [-128~127] となり、256 個の 2 進数は正確に 256 個の整数を表現することになりますが、実際の 2 進演算ではこの範囲を超えると 256 (x+128) mod 256 の剰余演算となります。 - 128。

おすすめ

転載: blog.csdn.net/weixin_37909391/article/details/130833749