娘に分かりやすく符号付き整数を教えるシナリオ

[この記事](https://qiita.com/Yachida/items/ed7df72063e52cc34887)を書いてから早二ヶ月が経ち、娘も生後半年を迎えました。

読んでいただいた周りの方から面白かったと好評を得たので書いてよかったなと思っていたのですが、なんと[AdventCalendar2017のQiita開発チームが選ぶベスト記事](http://blog.qiita.com/post/171043969974/adcal-2017-present-result)に選ばれていました！

![best3.png](https://qiita-image-store.s3.amazonaws.com/0/58330/ffb86da5-dc66-6efa-7aff-b81a2b05bc56.png)

正直、喜びよりも驚きの方が大きいです。
技術的にチャレンジしたわけではなかったですし、プレゼント企画のことも発表後に知ったので・・・

ですが、記事内容を端折って書いた箇所もあり、一部誤解を招く説明になっていました。
なので前回説明の少なかった__符号付き整数__ついて娘と会話してみます。
（本当は浮動小数点数の精度による誤差も書きたかったのですが、それはまたの機会に・・・）

[前回](https://qiita.com/Yachida/items/ed7df72063e52cc34887)からの続きになっていますので、事前に読んでおくと分かりやすいかと思います。

ちなみに「本当に家でこんな会話してるの？」と何人からか聞かれましたが、本当です。

---

:baby_tone1: 「おとーしゃんおとーしゃん。この前教えてもらった符号あり整数が変でしよ。」

:bear: 「どうしたななちゃん。0と1だけ使って0より小さい数字を表してたのかな？」

:baby_tone1: 「そんなことやったって誰も得しないでしよ！2進数に変換するツールでマイナスの数字を変換したらおかしなことになったんでし！とにかく見るでし！」

![1.png](https://qiita-image-store.s3.amazonaws.com/0/58330/359fcad1-c3e2-2cf3-7aa8-c84fb6cba8a7.png)

:baby_tone1: 「0を表現しようとしたら全部OFF、つまり全部0だから0になるでし。」

:bear: 「そうだね。1の場合は一番右の桁だけONで1になってるね。」

:baby_tone1: 「1番左の桁がプラスかマイナスかを表すって聞いたでし。つまり__0__0000001を__1__0000001にすれば-1になると思ったんでしけど・・・」

![2.png](https://qiita-image-store.s3.amazonaws.com/0/58330/c7e5ee7c-c816-fcb6-aea9-651d65d007d1.png)

:baby_tone1: 「なんと-127になったんでしよ！-1は全部ONで11111111だったんでし！わけが分からないでし！」

:bear: 「実はマイナスにする場合は、元の数の2の補数にしないといけないんだよ。」

:baby_tone1: 「な～にを言ってるでしかねー。詳しく聞きたいでし！」

---

:bear: 「まずは1と-1を2進数で見比べてみよう。」

![3.png](https://qiita-image-store.s3.amazonaws.com/0/58330/ad19fa9a-17c3-85dd-7309-9fbbb22ee639.png)

:baby_tone1: 「見比べたでしよ。ON/OFFがほとんど逆でしね。」

:bear: 「この状態が2の補数になっているんだよ。」

:baby_tone1: 「その2の補数ってやつは、いったいなにものなんでしか？」

:bear: 「各桁のON/OFFを逆にして、一番右の桁に1を足した数のことを2の補数っていうんだ。」

:baby_tone1: 「なんだか分かりにくいでしねー・・・。つまり__その数にとって、足すと桁が1つ増える数__ということでしよね？」

:bear: 「たしかにそっちの方が分かりやすいね！実際にはこういう感じで求められるよ！」

![4.png](https://qiita-image-store.s3.amazonaws.com/0/58330/2a7e93f3-7df3-242c-d4a6-88afd08fa2e3.png)

:baby_tone1: 「たしかに-1は全部ONだったでしから、あってるでし！」

:bear: 「ななちゃんが言ってた、プラスとマイナスを足すと桁が1つ増えるっていうのも見てみようか。」

![5.png](https://qiita-image-store.s3.amazonaws.com/0/58330/9f8bec57-34cb-fd8f-7786-133e4698d4f1.png)

:baby_tone1: 「そうなんでし！マイナスにするには各桁を逆転してから+1するで分かったでしけど、感覚的にはプラスの数にとって桁が1つ増える数という感じなんでしよね～。」

:bear: 「ななちゃんかなり良い感覚持ってるね！これで0と1だけ使って0より小さい数字が表せるね！」

---

:baby_tone1: 「でもなんなんでしかねー。どうしてこんな方法でマイナスを表現してるんでしか？別に一番左の桁だけ逆にしたらマイナスになるでもいいでしよね？」

:bear: 「実はこの方法だと計算が簡単になるんだよ。なんと全部足すだけで計算できちゃうんだ。」

:baby_tone1: 「マイナスがあっても足し算でいいってことでしか？マイナスがあったら引き算しないと計算できないでしよ！こんな感じで結局は引き算でし。」

$(5) + (-3) = 5 - 3 = 2 ∴ 101 - 11 = 10$

:bear: 「確かに引き算でも計算できるけど、マイナスが2の補数だと足し算だけでいいんだよ。」

:baby_tone1: 「おとーしゃんさっきから同じこと言ってるでしね。さっそく計算してみるでし！」

---

:bear: 「じゃあ 5 - 3 を足し算してみるよ。2進数するとこんな感じだね。」

![6.png](https://qiita-image-store.s3.amazonaws.com/0/58330/2271daac-f8ea-64cb-fdd5-174bc86a8a36.png)

:baby_tone1: 「足したら桁が増えて9桁になってるでしね。でも増えた桁以外だけ見ると、たしかに2になってるでし！一番左の桁はどうするでしか？」

:bear: 「捨てちゃうよ。基本は8桁の数か、その倍数で数字を表現するからね。」

:baby_tone1: 「なんだかもったいないでしね。マイナス同士の計算もやってみるでし。」

![7.png](https://qiita-image-store.s3.amazonaws.com/0/58330/3aabfc5a-44a2-a729-e721-ab5d4fae57cc.png)

:baby_tone1: 「やっぱりあってるでし！これなら足し算だけで十分でしね！」

:bear: 「ちなみにプラスの15（00001111）とマイナスの15（11110001）を足して一番左の桁を捨てるとどうなるかな？」

:baby_tone1: 「__1__ 00000000になって、一番左の__1__を捨てるでしから全部0になるでしね。15と-15を足したら0になるでしから当然でし・・・あっ！__マイナスはその数にとって、足すと桁が1つ増える数__と繋がった気がするでしよ！？」

:bear: 「その通り！マイナスを2の補数で表現してたのは、足すだけ減算ができるようにするためだったんだ。ななちゃんは感覚的には分かってたんだよ。」

:baby_tone1: 「減算器も結局は全加算器を使った回路でしからねー。根本的にはおんなじなんでしね。」

:bear: 「うん。そのあたり知ってるなら分かって当然だよね。お父さん回路は苦手だなー・・・」

---

いかがだったでしょうか？

娘大きくなって、いつかインターネットでこの記事を見つけたらどう思うのか・・・
勝手に登場させないで！と怒られるかもしれませんが、娘が読んでも分かりやすく面白いねと言われること願って書いてみました。

あと、実は2進数のマイナスが2の補数を使用する理由は記事を書いてて初めて知りました。
自分の勉強にもなって良かったです。



今度は前回説明の少なかった__浮動小数点数の精度による誤差__について書こうと思っています。
少し時間が空いてしまうかもしれませんが、その時はまた読んでいただけたらと思います。