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 指定されたファイルが見つかりません。
最初から、順番に手引書を読んでいくのが、結果として効率がよいことが 多いようです。