アセンブラを始める際に必要な前情報で、意外と説明されていないのが、この数の表現です。また、これを調べようとネット検索すると、なんか少し難しい説明がよくヒットします。そもそも数字の概念はどうやって決まっているのでしょうか。


  • 10進数
私たちが日頃普通に使っているのが10進数です。知っている人も多いと思いますが、この10進数は元々我々人間の両手に合わせて10本の指があるから、1から10まで表現できるため、と言われています。※ 諸説あります。

さて、指折り数えていきます。
いーち、にー、さーん…、じゅーう。
1-10まで
さて、そこからは数えることが出来ません。仕方が無いので、そばに石でもひとつ置いて、11として、また最初から指折り数え始めます。
11
この「石」が桁上がりです。我々は普段から無意識に桁上がり計算を行っています。いや、本当は10の時点で桁上がりが起きていますが、この頃はまだゼロが発見させていなかったので、ゼロが見つかってから、辻褄が合わなくなっています。では、改めて今度は 0 から数えていきましょう。

0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10

…ここで2桁になりました。
桁が増えたので桁上がりなんです。


  • 2進数
コンピュータの動作は、内部では電気信号のやりとりでしかありません。つまりは On と Off です。これと同じ状態で確認するため、電球の点灯で数を数えて確認してみましょう。電球は On と Off、つまりは点灯と消灯の2種類しか状態がありません。これでは 2 以上を表現できないので、大きい数を数えるためには二つ以上の電球が必要になります。電球が二つ…この状態が桁上がりです。

2進数では、このように点灯と消灯の2種類の組合わせによって、数を表現しています。電球で数を数えていくと
zero


 0
one


 1
onezero

 10
…電球が二つになったので、ここで2桁となります。

このように2進数では 2 になるタイミングで桁上がりが起きます。コンピュータの内部では、電圧の On と Off が数字の 0 と 1 を表現しています。桁数が増えると同時に扱える数字が増えるというわけです。レトロPCでは 8bitが多いため、11111111 と8桁の2進数を扱えることになります。そして、この桁数のことをビットと呼んでいます。8桁の2進数を扱うコンピュータの事を 8ビットコンピュータと呼ぶ所以となります。

8bitコンピュータでは、全ての桁を並べて表現することが多いです。先の数えている状態を、本来の2進数表現で記述すると

00000000
00000001
00000010
00000011
00000100

と表現します。8ビットコンピュータにとっては、この8桁の範囲は「同時に扱える最小単位の数」となります。11111111 は10進数で 255 となります(後述)ので、8ビットコンピュータは 0 から 255 までが同時に扱える数の単位となります。


  • 16進数
コンピュータが2進数しか扱えないと説明しました。ただ、2進数のままではコンピュータには都合が良くても我々人類にはなかなかに不可解です。そこで、4桁の2進数で数値表現することに誰かが決めました。4桁の順列組合わせに数字を割り当ててみましょう。

0000 = 0
0001 = 1
0010 = 2
0011 = 3
0100 = 4
0101 = 5
0110 = 6
0111 = 7
1000 = 8
1001 = 9
1010 = 10 ???

桁上がりしちゃいましたね。これでは困ります。10以上の数値を1文字で表現するため、英字が採用されました。数えるのを続けます。

1010 = A
1011 = B
1100 = C
1101 = D
1110 = E
1111 = F

これが16進数です。F の次は桁上がりしますので 10 という数値となります。8ビットコンピュータでは 11111111 と8桁の2進数を扱えましたので、上位4ビットが 1111、下位4ビットも 1111 と4ビット毎に分けて数値化します。例えば 11011010 という2進数は、1101 = D, 1010 = A ですので、16進数では DA という数値となります。DA は10進数で 218 となります(後述)。


  • 表記について
それぞれの「進数」で表記を区別しないと間違った値になる可能性があります。例えば、111 とあっても、2進数だと 7 ですし、16進数だと 273 になります。数値の表記方法はコンパイラやアセンブラや言語によっても変わりますが、大凡、以下のような記述方法になります。

 2進数 :  0b00000111, %00000111
16進数 : 0x0111, &H0111, $0111, 0111H

なお、0111H という表示形式の場合、先頭を必ず 0 にするという規則がある場合が多いです。理由は F300H とした際に、ラベル名か数値かの判断が出来ないためです。この場合は 0F300H と書くことで、アセンブラがこれを数値として認識できます。


  • 10進数に変換する
各桁毎に基数がありますので、それをかけ算していくと比較的簡単に10進数にできます。ただ、慣れの問題もありますが、16進数では例えば D とでたら即座に 13 と答えられるぐらいに慣れると宜しいかと。

まず16進数からですが、例えば2桁目の基数は16です。3桁目の基数は256です。4桁目の基数は4096です。これは情報処理の世界では 16のべき乗で表されています。16^2 = 256, 16^3 = 4096 だからです。この考え方は16進数や2進数に限らず、全ての進数に適用できます。例えば私は今年 20歳なんです。但し、29進数で、ですけど(笑

2進数でも念のため確認します。各桁毎の基数は 1,2,4,8,16,32,64,128,256 と続きます。もちろん2のべき乗です。この数値列はよく使いますので、覚えちゃうと便利と思います。2進数で 0b001011 は 1 + 2 + 8 = 11 となります。先に紹介した 0xDA は、0b11011010 ですので、2 + 8 + 16 + 64 + 128 = 218 になるのです。アセンブラプログラミングを続けていくと、最終的には 11 と言えば 0x0B です等と、パッと見ただけで脳内変換できるような状態になっていくと思います。

パッと見て脊髄反射で理解できると便利なキリの良い数字は…
  10進数  2進数  16進数 
0  0b00000000 
0x00
15  0b00001111  0x0F
255  0b11111111  0xFF

最低限これぐらいです。

16進数の各桁をイメージできると、そのうち10進数に変換しなくても、0xD0 と書いてあるだけで、だいたいこんなもんとそのまま16進数で理解できるようになります。それが講じると 0x18 + 0x3C = 0x54 とかそのまま暗算できたりします。日常生活には全く不要なんですけどね(笑
※ 関数電卓使えば一発なんですけどねと、最後に元も子もないことを言ってみる(汗



  • 2進数や16進数を覚えると?
レトロPCのグラフィックは、だいたい2進数の各ビットが、そのまま画面上の1ドットに対応していることが多いです。そのため、画像処理を行うためには、ビットのイメージを掴むことが重要になります。この後記事として公開を予定している Z80のレジスタとフラグの説明には、ビットの概念の理解が必要です。オマケで国家試験の基本情報技術者試験午前問題で+2点取れるかもしれません(笑)。真面目な話、レトロPCでアセンブラでプログラムが組めるようになると、基本情報処理の午後問題が楽勝に感じるようになってきます。この際、感覚として会得しておくことをオススメいたします。

これのどこが Mathematics なんやというツッコミは勘弁してください(汗
255 を超えたらどうなるのかは数から演算のお話に変わりますので後日説明します。