2の補数
-nはnのビット否定に1を足したもので表されている。
この表し方を使うと、引き算が足し算と同じ仕組みで解くことができて便利。
どうして「1を足す」のか。
1を足す理由、個人的な納得方法
(16bitで考えることにしてみる。)
$ 0 = -0 としたい。
ビット否定だけでは0と-0、つまり$ 0000000000000000_{(2)}と$ 1111111111111111_{(2)}は違う数字である。
-0に1を足すと、いい感じにオーバーフローして$ 0000000000000000_{(2)}になる。
この「反転して1を加える」やり方だと、0 = -0 がいえる。
n + (-n) = 0 としたい。ビット否定だけでは、
$ 0010010011100111_{(2)} + 1101101100011000_{(2)} = 1111111111111111_{(2)}となるように、0にならない。
ここで-nを、ビット否定に1を足した$ 1101101100011001_{(2)}みたいな感じにすると、足した時にいい感じにオーバーフローして$ 0000000000000000_{(2)}になってくれる。