i = 13 % 10;なおこの余りの3は、「13」の一の位の数であることに注意しましょう。
これは、その変数に代入できる数値の限界に関係してきます。 例えば符号なし8ビット(unsigned char型)では0〜255の数値を 表現できますが、その上限である255の次は0になります。 例えば次のプログラムでは、最終的に変数xに値は0になります。
unsigned char x; x = 255; x = x + 1;このように変数がプログラム中でとりうる値に 注意する必要があります。
代入できる数値の限界には、符号の有無も関係しています。 同じ8ビット(1バイト)であっても、 符号つき8ビット(char型)では-128〜127になります。
なお、一般には、ある型が何ビット(何バイト)であるかは、一定ではなく、 CPUの種類や用いるコンパイラに依存します。 変数の型が何バイトであるかはsizeof()という関数で得ることができますので、 次のような記述を含むプログラムを実行し、確認をしておくとよいでしょう。
num3 = sizeof(long); num2 = sizeof(int); num1 = sizeof(short); num0 = sizeof(char);
ビット数 | 符号あり | 符号なし |
---|---|---|
8bit | -128〜+127 | 0〜255 |
16bit | -32,768〜+32,767 | 0〜65,536 |
32bit | -2,147,483,648〜+2,147,483,647 概ね -2×109〜+2×109 |
0〜4,294,967,296 概ね 0〜4×109 |
電圧1.3Vのように小数点以下1桁の実数値を扱いたい場合には、 10倍して整数演算すると良いでしょう。 100倍や1000倍でもかまいません。
実数を使おうとすると、以下のようなエラーになります。
*** FATAL ERROR L210: I/O ERROR ON INPUT FILE: EXCEPTION 0021H: PATH OR FILE NOT FOUND FILE: C:\KEIL\C51\LIB\C51FPS.LIB
char hoge(void) /* 関数の定義 */ { ... } main() { ... a = hoge(); /* 関数の呼び出し */ ... }
int b;
」はエラー (Syntax error) になります。
最初の実行文「a = 0;
」より前に置く必要があります。
int a; main() { a = 0; int b;
main() { char i; for(i = 0; i < 10; i++){ hoge(i); } }これは、あとでプログラムをデバッグしたり読み直すときに、 格段に効率が高くなるでしょう。
もちろん、このような機能に頼らなくても済むように、
インデントをきちんとする、
コメントを書くなどの工夫をしておくことをお勧めします。
プログラムの転送ができない
プログラムを転送しようとすると下記のようなエラーになる場合には、
USBケーブルを抜いて、もう一度挿し直してみましょう。
なお、CPUボードのリセットボタンを押すと、
このような症状になることがあるようです。
Toggle 8051 Reset Failed to Open Driver Reset Failed 指定されたファイルが見つかりません。
最初から、順番に手引書を読んでいくのが、結果として効率がよいことが 多いようです。