天国にいけるC言語入門 シーズン1 パソコン超初心者がゼロから東方風シューティングをつくる編 ver.0.4.15.789 RELIEF
☆☆自然の妙 すばらしい自然のシステム。 ときどき2の補数の性質
☆☆自然の妙 すばらしい自然のシステム。 ときどき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言語入門ヘキサ構造体にて解説されます)
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます