☆☆自然の妙 すばらしい自然のシステム。 ときどき2の補数の性質

以下 光り輝くレポート用紙より


ここでひとつの2進数00000011(10進数では3)を用意します。


2進数00000011(10進数では3)の2の補数は


2進数11111101となります。


この2進数と2の補数を足し合わせると


00000011+11111101=100000000となります。


ここで00000011、11111101は8ビットで


100000000は9ビットとなっていますが


コンピュータ内で8ビットを基準に数値を処理するシステム


つまり


          計算に使用するデータも


          計算結果のデータも



         8ビット内に収めるシステム


では


8ビットより桁の多い数値は処理できず


コンピュータ内では


00000011(8ビット)+11111101(8ビット)=100000000の


100000000(9ビット)の先頭の1の部分は認識されず


消えてしまい


100000000は00000000となっています。


つまり


00000011+11111101=00000000(8ビット)


となっており


00000011に11111101をたして


ほんとたまたま


00000000=0を表現できたことになります。


(8ビットを基準に数値を処理するシステムでは


2進数0であっても8ビットの基準容量いっぱいまで


0をうめるきまりがありますので


0の左側に7つ0をうめて


0は00000000となります。)


つまり


00000011+11111101(00000011の2の補数)=00000000


をお昼ご飯をたべながら、ニコニコ動画をみながら


じっとみていると・・・


マックス 「???」


00000011の2の補数11111101は


コンピュータ内ではちょうど


3+(-3)=0のように


マイナス符号をつかわなくても00000011と同じ大きさで


符号が反対の数ということにきづかれるかもしれません。


つまり


2の補数11111101だけでは何のことか意味がわかりにくいのですが


00000011+11111101=00000000の式の中で


00000011と2の補数11111101の関係性をとらえていくと


00000011=10進数 3

11111101=10進数 -3


となっているのがわかりますね。


              2の補数を使えば



コンピュータ内で


        🐓 2進数Aから2進数Bの引き算を行いたい場合🐈



         🐤 2進数Aに2進数Bの2の補数を😻



       🐤だけでにすることができるのです😺

 


大変便利なシステムになっています。



           🍓この2の補数のシステムは🍓 



コンピュータ内で8ビットを基準に


数値を処理するシステム


すなわち、



//計算に使用する数値も計算結果の数値も


            同じ8ビット内に収めるシステム//



において 2の補数同士を足した場合


8ビットより桁の多い数値は処理できず


00000011+11111101=100000000の


100000000(9ビット)の先頭の1の部分は


機械的に認識されず消えてしまい


100000000は00000000となるという、


機械的な性質(偶然)にもとづいています。


マックス 「むむう・・・


ま~さ~か~~・・・


2の補数の性質をつかうために


意図的に


8ビットを基準に数値を処理するシステム


つまり //計算される数値も計算結果の数値も


           同じ8ビット内に収めるシステム//


を採用しちゃったりしてるのでは・・・・・???


今まで


ある数値データは7ビット

ある数値データは2ビット

ある数値データは3ビット


1bit単位で いろんな数値データを管理すればいいのに 


char 型8ビット

int型32ビットのようになぜ


きまった定格のデータ容量にそろえて2進数数値を格納してるのか


とおもっていたんだな~」



老人 「そうじゃのう。


8ビット(1バイト)を基準に数値を処理するシステムを作っていったら


2の補数の性質がつかえた


のか


2の補数の性質をつかうために


8ビットを基準に数値を処理するシステムを作った


のか・・・


8ビット(1バイト)を基準に数値を処理するシステムを作りたい


という思いと


2の補数の性質を使いたいという思いが


相互に影響しあって今のシステムができあがったのかものう。


さても意味深いことよのう。


その際には おたがいが情報を交換、改良(フィードバック)しあって


よりよいシステムに作り上げていったのじゃろう。


さても自然の妙


すばらしい自然のシステム。


そうはおもわんかのう。


マックスや?


8ビット(1バイト)を基準に数値を処理するシステムを作りたい


という思い


システム内で2の補数の性質を使いたいという思い


どちらかが一方的に


他方のシステムをつくりだしたとはいえんのかものう。



ふぉ ふぉ ふぉ ふぉ ふぉ ふぉ ふぉ ふぉ ふぉ


ふぉ ふぉ ふぉ ふぉ ふぉ ふぉ ふぉ ふぉ ふぉ 


ふぉ ふぉ ふぉ ふぉ ふぉ ふぉ ふぉ ふぉ ふぉ


ふぉ ふぉ ふぉ ふぉ ふぉ ふぉ ふぉ ふぉ ふぉ


ふぉ ふぉ ふぉ ふぉ ふぉ ふぉ ふぉ ふぉ ふぉ


ふぉ ふぉ ふぉ ふぉ ふぉ ふぉ ふぉ ふぉ ふぉ




気持ちよさそうに笑う老人。


マックス


「な、なんだか 深遠な感じが・・・」


____________________________

ちょっと解説のコーナー


もし数値データを


🍎計算に用いられる数値と計算結果も



同じ8ビット内に収めるシステムでなら🍎



2進数とその2の補数値の足し算


00000001+11111111は1bit繰り上がって


(ここで11111111は00000001の2の補数となっています。)


は100000000(9ビット)となります。


00000001と11111111を足し合わせたものは


100000000であり


00000000にならないため


2進数00000001の


2の補数11111111は-1を表現できていませんね。


つまり


2の補数をつかってマイナスの値をもつ2進数を表現できなくなるため


2進数と2の補数の足し算のみで


引き算を表現できなくなります。



計算結果の数値データも同じ8ビットに収めないとします。


5-5=を2進数で実行してみます。


5は2進数で00000101と表現され


-5は2の補数のシステムをつかい11111011と表現できます。


ですので


5-5=00000101+11111011=100000000=256となります。


00000101(10進数5)の2の補数11111011は


(10進数-5)の役割を果たしていませんね。


これでは


5-5が2進数同士の足し算のみで実行できていません。


これは 計算結果も 8ビット内に収め


100000000を00000000としないことによります。



そこで 2の補数がマイナスの2進数の役割をはたせるよう


8ビット単位で数値データを管理しようとすることになるのですが


8ビットにこだわらなくても


実は1ビット、2ビット、3ビット・・・・・


の自由な数値のビット単位で


つまり


計算に用いられる数値と計算結果の数値も同じビット内に収めるシステムで管理しているなら



2の補数の性質はつかえ


マイナスの2進数をあらわすことができるようになります。

(ただし 1ビット、3ビット、5ビット・・・・・のように奇数ビットの場合は問題が起きてくるのですが…詳しくは天国にいけるC言語入門ヘキサ構造体にて解説されます)


計算に用いられる数値と計算結果の数値も同じ1ビット内に収めるシステムの場合を


考えてみましょう


1-1を2進数の足し算のみで計算してみたいとおもいます



この場合 2進数 1の2の補数は 2進数1で(-1)を表しています。


( 2進数1の1を0にひっくり返してから1をたすことで


2進数1の2の補数は 2進数1となっていますね)


1-1を2進数の足し算のみで計算したいなら


1+1(1の2の補数)を計算し1+1=10となったところを


計算結果10も1ビット内に収めれば


1+1=0となる


イコール


1-1=0

が2進数の足し算のみ計算できています。


計算前と計算結果も同じ4ビット内に収めるシステムの場合


0001の2の補数は


0001の0と1をひっくり返した1110に1を加えた


1111となります


0001の2の補数は

1111で(-0001)をあらわしています。


0001- 0001を計算するとき


2の補数1111をつかって


0001- 0001の代わりに


0001+1111を計算すると


0001+1111=10000となります。


計算結果も同じ4ビット内に収まるのならば


0001+1111=0000となります


イコール


0001- 0001=0000となり


0001- 0001が2進数の足し算のみで計算できています。


次に


計算に用いられる数値と計算結果の数値も同じ10ビット内に収めるシステムの場合 


0000000001の2の補数は


0000000001の0と1をひっくり返した1111111110に1をくわえて


1111111111となります


1111111111は


-0000000001に対応する数値となります。


0000000001- 0000000001を


2進数の足し算のみで計算したいなら


- 0000000001のかわりに1111111111をもちいて


0000000001+1111111111を計算し


0000000001+1111111111=10000000000となったところを


計算結果も10ビット内に収めれば


0000000001+1111111111=0000000000となります


イコール


0000000001-0000000001=0000000000となり


0000000001-0000000001を2進数の足し算のみで計算できています。


つまり


どの ビット単位で数値データを管理した場合でも



       🍎計算に用いられる数値データも計算結果の数値データも🍎


       🍎同じビット数内に収めるシステムで 🍎


       🍎     管理しているなら    🍎



2の補数をつかってマイナスの値をもつ2進数を表現できるので


2進数同士の引き算を


2進数と2の補数の足し算で表現できます。


ようは


2進数とその2の補数値をたしあわせたとき


データ量が1ビット増え


最高位が1、それ以下の位は0となるのですが


最高位の1を取り除いてしまえば


2進数とその2の補数値同士の足し算は0となり


2の補数は2進数と同じ大きさでマイナスの数を


あらわしていることになるのです。


ですから


2進数と2の補数の足し算で引き算を表現するのに


かならずしも8ビット単位で数値データを管理する必要は


ありません。



計算結果も同じビット数におさめなければならないため


とりあえずは あるビット単位で数値データを管理する必要があります。


それが8ビットに採用されたわけです。


(ただし 1ビット、3ビット、5ビット・・・・・のように奇数ビットの場合は問題が起きてくるのですが…詳しくは天国にいけるC言語入門ヘキサ構造体にて解説されます)

  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る