使用するルールは5つだけ
さっそく、今回使うC言語のルールを見てみましょう。以下の5つです。
- 変数と演算子
- ループ制御
- 条件判断
- 関数
- 便利なおまじない(define、include、pragma)
マジカルボックスのプログラムは上記のルールだけで記述してあります。本来C言語は、ルールごとに相当数の記述方法のバリエーションを持っています。そこで、それらについても、必要最低限(かつ、ちょっとしたプログラムを記述するには十分な内容)に厳選しています。たとえば、変数には10種類以上の型(変数の大きさを示すもの)がありますが、マジカルボックスのプログラムで使っているのは2種類だけです。難しいと言われるポインタ変数や配列はもちろん登場しません。
まずは変数から
プログラムでは、いろいろな値を入れておく入れ物が必要です。この入れ物を変数と呼びます。たとえば、a=b+5;(aにbと5の和を入れる)という処理の場合、aとbが変数です。
C言語では、変数を使う場合にはまず「こういう名前の変数を使いますよ」と宣言をする決まりになっています。そして宣言をするときには、その変数の大きさ、つまり扱うことのできる値の範囲を「変数型」として示す必要があります。マジカルボックスのプログラムで使う変数型は、char(キャラ型)とint(イント型)の2つです。
charは、charactor(キャラクタ)という単語からきていて、その名のとおり本来は文字(アルファベットとか数字)を扱う目的の変数型です。一般に8ビット(=1バイト)の大きさを持ちます。char型の変数で扱うことのできる値の範囲は-128から+127までです。実際のプログラムでは、特に文字に用途を限らず、前記の範囲の小さな値を扱うときにこの型を使います。
一方intは、integer(インテジャー)の略で、整数型を意味します。サイズは、実行するマイコンで一番効率よく扱うことのできる大きさが割り当てられます。マジカルボックスに使用している78K01S/KA1+用のCコンパイラCC78K0Sでは、intは16ビットの大きさです。扱うことのできる値の範囲は、-32768から+32767です。
ここでは、変数の構造について、8ビットの場合を例に説明します。
8ビットのうちの最上位の1ビットは、符合、つまり値が正か負かを表すのに使用されます。最上位ビットが0なら正の値、1なら負の値です。図1に構造を示します。
正の値の場合、b7は0で、b6~b0が0000000~1111111の範囲で表現できます。すなわち、十進数でいうと0から127までです。
一方、負の値はどうなるでしょうか。コンピュータでは一般に負の値は、「2の補数」という表現方法を使います。2の補数の求め方は、変数の大きさよりも1ビット大きい値で、最上位ビットだけが1の値から、元の数を減算します。
たとえば-1は、以下のようになります。
1 0000 0000 (8+1ビットの最上位が1の値) - 0000 0001 (1を引く) ―――――――――――――――――――――― 1111 1111
得られた値に1を足せば0になる(8ビットからはみ出た分は消える)ことからも、この値が-1であることがわかります。2の補数は、元の値の0と1を反転させたものに1を足しても求めることができます。
0000 0001 (1) 1111 1110 (0と1を反転して) 1111 1111 (1を足す → -1の2の補数表現)
ではこの表現方法で、8ビットにおける一番小さな負の値はいくつでしょうか。
一番小さい値は、最上位の符合ビットを残して他が全部0の値、つまり1000 0000です。これがいくつかは、2の補数を計算して符合を反転させてやるとわかります。1と0を反転させると0111 1111。これに1を加算すると、1000 0000となり、128です。つまり元の値は-128であり、これが符合付きの8ビット変数で表現できる一番小さい値です。16ビットの場合も考え方は同じです。
変数の宣言のしかた
変数は、型 変数の名前;で宣言します。たとえば、char型でShoeishaという名前の変数を作りたければ、以下のように表記します。
char Shoeisha;
変数名には、アルファベット、数字、_(アンダーバー)を使うことができます。アルファベットの大文字と小文字は区別されます。また、以下のような制限があります。
- 先頭文字に数字を使ってはいけない
- C言語の予約語(たとえば whileとかifとかmainとか)を使ってはいけない
- あまり長い名前は区別がつけられないことがあるので注意(長さ制限は、Cコンパイラの仕様で決まります)
- _(アンダーバー)から始まる名前は、コンパイラのライブラリなどで内部的に使用されていることがあるので、避ける方がよい