❤恋するコンピュータサイエンス❤

コンピュータサイエンス、3DCGをもっと楽しく、もっと本質的に!c言語、c++の記事中心です

C言語における負の数の取り扱い方

Q.
数字の
-5
等の負の数はc言語においてどう処理されるか?


A.
2の補数で処理されます
ある数と足して0になるのは、その数のマイナスである。
と考えると分かりやすいです。
1番上位のビットが1で負の値が表現されます
0110 0100 ←100
1001 1011 ←ビット反転
1001 1100 ←1を足す
1001 1100が-100を表します

解説)
5 + ? = 0
とした時に、?に入るのは -5 である。と。

 

これを4bitの2進数で表すとこうなります。 
0101 + ? = 0000

 

実際には、足し算で0には出来ないので、こうする事を考えます。
0101 + ? = 10000

 

都合の良い事にコンピュータの場合は、4bitと言ったら本当に4個しかデータを持てないので、一番先頭の1はこぼれて消えてしまいます。

 

あとは逆算すると、
0101  + 1011 = (1)0000

そして、5 (0101) から -5 (1011) を導き出す為の手順が、
ビット反転して、+1する
なのですが、これも理由はシンプルで、

ある2進数をビット反転したものと、足すと、どんなパターンでも結果は、1111 と全て1になります。
0だったところは反転して1になり、
1だったところは反転して0になるので、
0+1 or 1+0 で、全て1になります。

全部の桁が1になったら、それに+1すれば、繰り上がって、最後の1は追い出され、全部の桁が、0になります。

結果、
元の数 + (反転して+1) = 0
になります。