以前、負数の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) まで辿り着く。
こう考えるようになってから、イメージがわくようになった。最近、こういった低レイヤのことを意識する機会は減ってきたが、トラブルシュートでダンプ解析する時などはやっぱり必要になるので、ここに書いておく。