今まで、一口に数値という表現を使ってきましたが、
C言語で扱われる数値は、2種類存在しています。
それは、
整数と実数です。
整数とは、自然数に、0と負の数を加えた数のことです。
たとえば、1、-1、0、5、8、7・・・、などの数のことで、
要するに、我々が普段使用している、普通の数のことを整数と呼びます。
実数とは、整数に、小数値を加えた数のことです。
たとえば、1.0、5.2、-9.687、3.14159、などの数のことで、
要するに、小数を含む数のことを実数と呼びます。
また、整数は、3種類の書き方を使うことができるようになっています。
それは、10進数、8進数、16進数の3種類に分かれています。
書式 |
進数 |
数字 |
10進数 |
0数字 |
8進数 |
0x数字 |
16進数 |
先頭に0をつけない数は、10進数として扱われます。
たとえば、100、25、68、71、19023 などは10進数です。
先頭に0をつけた数は、8進数として扱われます。
たとえば、0152、027、0756、030303 などは8進数です。
普通の感覚では、0152 も 152 も同じ数だと思ってしまうのですが、
C言語では、0152 は8進数(10進数では106)と解釈されるので注意が必要です。
また、同様の理由で、089、と言った数は、C言語ではエラーとなってしまいます。
なぜなら、8進数では、8 や 9 と言った数字は使用しないからです。
現実には、8進数を使うことはまれですので、先頭に 0 をつけないのが良いと思います。
ちなみに、 0 とした場合は、8進数でも 0 なので、別に問題はありません。
意外に良く使われるのが
16進数で、これは先頭に 0x をつけて表します。
たとえば、0xFF、0xA7、0x912C、0xABCD などは16進数です。
C言語では、文字コードなど、特定の意味の数値の表現に、
慣習的に16進数が使われることがある他、
ビット演算などの処理では16進数の表記が頻繁に使われます。
もちろん、初心者の人は当分使用することはないと思いますが。
なお、実数の表記には、10進数しか使うことができません。
コンピュータで実数を扱う方法は色々あるのですが、
C言語の場合
浮動小数点方式と呼ばれる方法を使用しています。
このため、C言語の世界では、実数のことを浮動小数と呼ぶことが良くあります。
【浮動小数点方式】
実数値を、数値の並び(仮数部)と、小数点の位置(指数部)で表す方法。
仮数部に、10の何乗などの値を掛け算して実数を表現する。
巨大な数から極小の数まで扱え便利だが、計算は遅い。
前章で行った計算では、10/3(10÷3) の答えが、3 と出されてしまいました。
これを、実数を使用して、なるべく正確に計算してみたいと思います。
ただし、分数じゃないので、完璧に正確には計算できません。ご容赦願います。
この様に、コンピュータで正確な計算を行うのは困難です。
実数を使用すると、必ず割りきれない数が発生する他に、
2進数で計算しているために起きる誤差もあります。
実は、2進数では 0.1 などの数値を正確に表せないためです。
通常であれば四捨五入してしまえば大きな問題になりませんが、
正確さが必要な銀行のコンピュータなどは、
10進数の分数として計算する仕組みを持つそうです。
実数で計算したい場合、数値を実数にすれば、自動的に実数の計算になります。
計算自体はそれで問題ないのですが、もう1つの注意点として、
表示する時に使用する出力変換指定子も変わってきます。
今までは、数値を表示する時には、%d指定子を使用してきましたが、
これは、整数値を数字に変換するための指定子です。
実数値を数字に変換する場合は、
%f指定子を使用しなければ行えません。
ここまでわかれば、後は簡単なことです。
次のプログラムは、前章のプログラムを、実数による計算に直した例です。
#include <stdio.h>
int main(void)
{
printf("%f\n", 10.0 + 3.0);
printf("%f\n", 10.0 - 3.0);
printf("%f\n", 10.0 * 3.0);
printf("%f\n", 10.0 / 3.0);
return 0;
}
このプログラムの実行結果は、次の通りになります。
13.000000
7.000000
30.000000
3.333333
いかにも実数で計算したと言う感じの答えになりましたね。
なお、今回は %(剰余)演算子を使用していませんが、これは当然のことです。
実数では余りは計算できませんから、%演算子は使えないのです。