補数と固定小数点について～なんとなく理解

# はじめに
皆さん日々の学習お疲れ様です。
今回は前回の基数変換より少し取り組みやすい
**補数と固定小数点**について書かせていただきました。
記事作成の目的は私のアウトプットなのですが、
もしよろしければ覗いていってください。

# 補数
コンピューター内部では「0」と「1」しか扱えません。そして引き算ができません。
負数を表現する一つの方法として今回学ぶ補数を使用します。

**補数**
　「**ある数**」を「**決められた数**」にするために、「**補う数**」
 だそうです。
 私も意味については深く理解しておりませんが使い方を理解すればきっと大丈夫！

 一般的に、N進数では「**N-1**の補数」と「**N**の補数」の2通りがあります。
 　①「ある数」に「N-1の補数」を補うと、**与えられた桁数の最大値**になる
  　②「ある数」に「Nの補数」を補うと、**与えられた桁数の、次のけたに桁上がり**をする

ということらしいです。
文字だけ見てもわからないと思うので例を交えて紹介できればと思います。

例 　　10進数には「9の補数」と「10の補数」の2つがあります。

 　　　 10進数3桁で表現する場合
   　　 　123の「9の補数」は876、「10の補数」は877になります。
　　　（9の補数）　　　
   　　　　　　　　 １２３
  　　　　　　 ＋　８７６　←9の補数を補うと
　　　　 　　　　**９９９**　 ←10進数3桁の最大値になる
　　　（10の補数）
 　　　　　　　　 １２３
  　　　　　　 ＋　８７７　←10の補数を補うと
　　　　　　　  **１**０００　←次の桁に桁上がりする

ここで10進数は3桁であるため桁上がりした1は**捨ててしまいます**。
ということは123＋877＝000になります。
つまり10の補数877は123の対の負数(－123)の意味になります。
なるそうです。。。

# 2の補数
個人的には過去問題を解いていると2の補数がよく出てくると感じましたので
大きく見出しを付けました

先ほどと同じく2進数には「1の補数」と「2の補数」があります。

例　2進数4ビットで表現する場合
　　0101の「1の補数」は1010
  　　　　　「2の補数」は1011　　　　です。
      
　　　（1の補数）　　　
   　　　　　　　　 ０１０１
  　　　　　　 ＋　１０１０　←１の補数を補うと
       　　　　　　　 　**１１１１**　←２進数4ビットの最大値になる
　　　（2の補数）
 　　　　　　　　 ０１０１
  　　　　　　 ＋　１０１１　←２の補数を補うと
　　　　　　　  **１**００００　←次のビットに桁上がりする

ここで！
2進数4ビットであるため桁上がりした1は捨てます！さよなら！
ということは
0101＋1011＝0000
2の補数1011は0101の対の負数の意味になっています。

コンピューター内部では**2の補数を使って負数を表現しています。**

現状なんとなくそんなものなんだなと考えています

# 2の補数の特徴
コンピューターには「マイナス」の記号がないため**先頭ビットを
符号ビットとして代用**します。
次に2の補数の作り方についてです
つまり頭に1があったら負数！みたいにザックリ私は覚えてます。

先頭ビットが負数になるかどうかは問題文に明記されていますので
しっかりと問題文を読むことも大事になります

# 2の補数の作り方
2の補数は次のように作ります
　(正数）　　　　　　　　　(1の補数）　　　　　　　　　(２の補数）
０１０１　→ビット反転→　　**１０１０**　　→1を足す→　　**１０１１**

1の補数は**ビットを反転**
2の補数は**1の補数に1をプラス**　
を頭に入れておきましょう。

また、2の補数(負数)から対の正数を求めるには同じことを行います
負数をビット反転して1を加えると対の数が出ます！

**例**
2進数「10000001」を10進数へ基数変換

この問題は符号なし2進数の場合答えは129
になりますが
問題文に**符号付**2進数の場合といったような記述があった場合
負数を2の補数で表現されます。

今回は符号付で扱います。
→先頭ビットが１なので2進数「10000001」は負数になります



# 固定小数点
コンピューター内部の数値の表現方法には**固定小数点**と**浮動小数点**があります。
今回は**固定小数点**についての説明です。

**固定小数点**
コンピュータ世界における小数の扱い方のひとつで、
小数点が特定の位置にある前提で扱うやり方

整数型で扱う場合**最右端の右側に小数点**
負数を扱う場合**最左端ビットを符号ビットとした2の補数表現**を使います

説明を見てるだけではわかりにくいので
例えば　　2進数8ビットの固定小数点を用いる場合
最小値が10000000(10進数でー128)、最大値が01111111(10進数で127)です。

(最左端ビット)　　　　　　　　(最右端ビット)
　↓　　　　　　　　　　　　　　↓
｜　｜　｜　｜　｜　｜　｜　｜　｜. ←小数点
　↑
(符号ビット：０または正数、１負数）

# おつかれさまでした
おつかれさまでした！
2の補数などはよく過去問題に出てくるので作り方をしっかり覚えておきましょう
**ビット反転して１プラス！**
これを覚えてしまえば勝ちです(きっと)

今回もお付き合いいただきありがとうございました。

こうしたほうがわかりやすいよ！などあればコメントに残していただけると幸いです。

今回もこちらにお世話になりました↓(参考文書）

https://www.bing.com/ck/a?!&&p=6d2aa83b5a5815adJmltdHM9MTcxOTc5MjAwMCZpZ3VpZD0zOWY1ZGExNi1hOWU4LTY5YWMtMWY2OC1jODE3YTgwMjY4MmEmaW5zaWQ9NTMyMg&ptn=3&ver=2&hsh=3&fclid=39f5da16-a9e8-69ac-1f68-c817a802682a&psq=%e3%81%8b%e3%82%84%e3%81%ae%e3%81%8d%e5%85%88%e7%94%9f&u=a1aHR0cHM6Ly93d3cuYW1hem9uLmNvLmpwLyVFNCVCQiVBNCVFNSU5MiU4QzA2JUU1JUI5JUI0LSVFMyU4MiVBNCVFMyU4MyVBMSVFMyU4MyVCQyVFMyU4MiVCOCVFRiVCQyU4NiVFMyU4MiVBRiVFMyU4MyVBQyVFMyU4MyU5MCVFMyU4MyVCQyVFNiU5NiVCOSVFNSVCQyU4RiVFMyU4MSVBNyVFMyU4MiU4OCVFMyU4MSU4RiVFMyU4MiU4RiVFMyU4MSU4QiVFMyU4MiU4Qi0lRTMlODElOEIlRTMlODIlODQlRTMlODElQUUlRTMlODElOEQlRTUlODUlODglRTclOTQlOUYlRTMlODElQUUlRTUlOUYlQkElRTYlOUMlQUMlRTYlODMlODUlRTUlQTAlQjElRTYlOEElODAlRTglQTElOTMlRTglODAlODUlRTYlOTUlOTklRTUlQUUlQTQtJUU2JUEwJUEyJUU2JTlDJUE4LSVFNSU4RSU5QS9kcC80Mjk3MTM4Mjcx&ntb=1

参考動画↓

https://youtu.be/oqaBEnhIxk0?si=tHwfbv3_PcVozixv