技術メモ

神奈川在住のITエンジニアの備忘録。おもにプログラミングやネットワーク技術について、学んだことを自分の中で整理するためにゆるゆると書いています。ちゃんと検証できていない部分もあるのでご参考程度となりますが、誰かのお役に立てれば幸いです。

負数の2進表記について

以前、負数の2進数での表現(いわゆる2の補数)の考え方がピンと来なかった。いつからか以下のように理解するようになり、それなりにイメージできるようになった。

例えば、1バイトのデータだったら、負数の最大値は 11111111 である。(負数なので先頭ビットは 1 。)  負数の最大値は -1 なので、この 11111111 が -1 である。これから 1 を引くと、11111110 となり、これは -1 より 1 小さい数なので -2 である。こんな感じで考えていくと、

11111111: -1
11111110: -2
11111101: -3
11111100: -4
11111011: -5
11111010: -6
11111001: -7
11111000: -8

・・・
10000000:-128

のように、小さくなるにつれて、下位 から 1 が削られていき、負数の最小値 10000000 (-128) まで辿り着く。 

 

こう考えるようになってから、イメージがわくようになった。最近、こういった低レイヤのことを意識する機会は減ってきたが、トラブルシュートでダンプ解析する時などはやっぱり必要になるので、ここに書いておく。