変数の種類を説明するにあたり、2進数と16進数の話しをしておこうと思います。変数の種類を説明するだけでこのページを終わらせてしまうのは短かすぎるので・・・。もちろん、関係があるから説明するのであって、C言語を説明していく上で何かの時に当たり前のように使うかも知れないので、今のうちに解説しておきます。
パソコンの内部ではプログラムが 0 と 1 で処理をしているのは重々ご存じかと思います。その扱うデータも 0 と 1 の集まりです。0 か 1 の1桁だけならば、2通りのデータしか表すことしかできません。2桁になると 00 01 10 11 の4通りのデータが表せます。3桁になると 000 001 010 100 011 110 101 111 と言う感じで8通りとなります。2の階乗で増えていき、7桁で128通り、8桁で256通りとなります。コンピュータは一般にこの8桁 256 通りを一区切りとしてデータを扱っています。つまり、00000000 でデータ一つの単位です。具体的に表すと、01000001 はアルファベット半角大文字の A を表します。対応はアスキーコード表なるものがあるので、そちらを参考にして下さい。普通、C言語に触れている本で有れば、表が載っているのが普通です、多分・・・。
01000001 は A を表すと先に書きましたが、8桁の数字を使って表すのは手間が掛かるし、場所もとります。このようなデータの話しをする場合、2進数と共に用いられるのが16進数です。何故、16進数が出てくるのかは後ほど説明するとして、まずは数え方から。普段の生活で僕たちが使っているのは10進数で9の次に桁上がりをして、10になります。16進数では15まで数えてから桁上がりをします。10進数で言う10〜15までをA〜Fで表します。つまり、16進数の数え方は次のようになります。
1 2 3 4 5 6 7 8 9 a b c d e f (桁上がり)
11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20
と言った感じです。16進数では一桁で16通りのデータを表すことが出来、2桁になると16の2乗で256通りのデータを表すことが出来ます。256と言う数字、ちょっと前に書きました。2進数の8桁で表す事の出来るデータの種類です。つまり、2進数8桁を16進数では2桁で表せるわけです。ここに16進数を用いる理由があるようです。(この辺は我流なので本当のところは・・・?)具体的には2進数 01000001 は A を表し、16進数では41,10進数では66です。2進数 11111111 は16進数では ff で10進数では 256 ですね。ややこしいですが、ゆっくり整理して下さい。
2進数で 00000000 のひとつの 0 をビット(bit)といい、8ビットで1バイト(byte)と言います。パソコンのハードディスクやメモリの容量を表す単位でバイトは「メガバイト」や「ギガバイト」などの単位で使われています。以降では「バイト」等は平気で使います。
2進数、16進数でかなりのスペースをとってしまいましたが、ここからは変数の説明です。
変数は先のページでちょっとだけ触れましたが、ここでは「データを入れる入れ物」としておきましょう。その箱に名前を付けて、その名前を使ってプログラムを作ります。データが数字ならば「Aと言う箱とBと言う箱に入っているデータをかけ算して画面に表示せよ」がプログラムになります。この「箱」を使うことによって、プログラムは実行されるときにその箱に入るだけの大きさのデータならば何でも入れる事が出来、実際の計算はコンピュータがやってくれます。
ここではこの「箱」の種類を説明しておきます。具体的には使ってみないと分からないと思うので、種類だけ。表わされるデータには文字の場合、数字の場合がります。(ちなみに、色も3原色で数字のデータとして取り扱われたりもしています)
半角英数の場合、1バイトで十分すべての場合を表すことが出来るので(7桁でも 128 通りあるから)、プログラムでも1バイトのデータとして扱います。全角となると平仮名、カタカナ(半角除く)、漢字があるのでとても1バイト256通りでは表しきれないので2バイト必要になりますが、1バイトの「箱」2つを用いて16ビットで表します。これら文字データは「char型」という、「箱」を用います。もちろん数字のデータも扱えます。256通りまでは。「箱」の種類を正式には「変数の型」と言います。
次に数字データは整数、小数や小さな数字、億などの大きな数字などで用いる変数の型が変わります。詳しくはこのページの最後の表を見て下さい。
また、変数の先頭ビットは符号に使われています。つまり、先頭ビットが 0 か 1 で正負を表すわけです。扱う数字がすべて正の数であれば符号のビットの分も使ってデータを表すこともできます。先頭を符号として扱う場合、8ビットの「箱」では7ビットでデータを表す事になり2の7乗分、正負0〜127までのデータしか扱えませんが、8ビットすべて使うと0〜255の256まで扱えるというわけです。(ここは正確には間違っていて、−0と+0が存在してしまうのでパソコンはもう少し、ややこしいことをして正負の判断とそのデータの絶対値を識別しています。これを説明するには「補数」の説明をしないといけないのでここでははしょります。)要するに「符号無しの数字型」もあると覚えて下さい。
ちょっと、難しくなりましたが、実際にプログラムを作っている最中に、「先頭のビットが 0 だから・・・」なんて考えて作るのではなく、「Aと言う変数に -1 が入っているから・・・」と言う風に考えるので直上までの「ここからは変数の説明です」から始まる文を深く考えないように。あくまでも、参考ですから。このページでは2進数と16進数、そして次の様な変数型の種類がある事だけを頭の片隅に置いておいて下さい。
で、回りくどくなりましたが、変数のサイズと名前、格納できるデータの範囲を示します。サイズ等はCPUによって違ってくるのでここではインテル系の最近のCPUについて、要するに Windows が動いている普通のパソコンでの主な変数型の例です。
データ型 | 名前 | サイズ | 用途 | 範囲 |
---|---|---|---|---|
文字型 | char | 1 | 主に文字、文字列を保存する。 | -128 〜 127 |
短整数型 | short | 2 | 整数データ | -32768 〜 32767 |
整数型 | int | 4 | 整数データ | -2147483646 〜 2147483647 |
長整数型 | long | 4 | 整数データ | -2147483646 〜 2147483647 |
短精度不動小数点型 | float | 4 | 小数データ | 7 桁 |
倍精度不動小数点型 | double | 8 | 小数データ | 15 桁 |
最近のインテル系は long と int のサイズが同じですが、コンパイラによっては違うものもあるので、「同じサイズ」と覚えるのではなく、区別しておきましょう。