アセンブラを始める際に必要な前情報で、意外と説明されていないのが、この数の表現です。また、これを調べようとネット検索すると、なんか少し難しい説明がよくヒットします。そもそも数字の概念はどうやって決まっているのでしょうか。
- 10進数
さて、指折り数えていきます。
いーち、にー、さーん…、じゅーう。
この「石」が桁上がりです。我々は普段から無意識に桁上がり計算を行っています。いや、本当は10の時点で桁上がりが起きていますが、この頃はまだゼロが発見させていなかったので、ゼロが見つかってから、辻褄が合わなくなっています。では、改めて今度は 0 から数えていきましょう。
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
…ここで2桁になりました。
桁が増えたので桁上がりなんです。
- 2進数
2進数では、このように点灯と消灯の2種類の組合わせによって、数を表現しています。電球で数を数えていくと
0
1
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 までが同時に扱える数の単位となります。
Fitbit(フィットビット)
2021-09-28
- 16進数
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 となります(後述)。
- 表記について
2進数 : 0b00000111, %00000111
16進数 : 0x0111, &H0111, $0111, 0111H
なお、0111H という表示形式の場合、先頭を必ず 0 にするという規則がある場合が多いです。理由は F300H とした際に、ラベル名か数値かの判断が出来ないためです。この場合は 0F300H と書くことで、アセンブラがこれを数値として認識できます。
- 10進数に変換する
まず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進数を覚えると?
これのどこが Mathematics なんやというツッコミは勘弁してください(汗
255 を超えたらどうなるのかは数から演算のお話に変わりますので後日説明します。
NSD ※ ダイナ・ビーだっ!
コメント