2.変数・配列

2-5. 定数

◆定数とは?

定数とはなんでしょう?と突然聞かれても意外と答えるのは難しいです。

未知数、既知数関係なしに一定で変わらない数ならば『定数』です。

それでは定数にはどんな種類があるか?(もちろんC言語での種類)

1.整数(int型)
2.実数(float,double型)
3.文字(char型)

基本的にはこの3種類ですが細かくするとデータ型の種類と同じくらいです。

ということで今日は整定数を取り上げたいと思います。

接尾語 l,u,U,L

たとえば、

1234, 0, -45

これらは、int型の整定数です。次に

1234L, 0L, -45L

接尾語としてL(小文字でも良い)をつけるとlong型になります。

1234u 0u

接尾語がuの場合はunsigned int型になります。

これらを組み合わせて、

1234ul 0ul

として、unsigned long int型の整定数を記述することが出来ます。

接頭語 0x, 0

接頭語に0xを付けると16進数表記になります。

0x0000, 0x1234, 0xff3a

また接頭語が0の時は8進数表記になります。

0123, 0567

これまでが、整定数の表記の紹介です。
これから整定数を表示するプログラムを作ります。

#include<stdio.h>

main()
{
    printf("10進数int            %d %d %d\n",1234,0,-45);
    printf("10進数long           %d %d %d\n",1234L,0L,-45L);
    printf("10進数unsigned       %u %u %u\n",1234u,0u);
    printf("10進数unsigned long  %u %u %u\n",1234ul,0ul);
    printf("16進数int            %d %d \n",0x1234,0x0);
    printf("16進数long           %d %d \n",0x1234L,0x0L);
    printf("16進数unsigned       %u %u \n",0x1234u,0x0u);
    printf("16進数unsigned long  %u %u \n",0x1234ul,0x0ul);
    printf(" 8進数int            %d %d \n",01234,00);
    printf(" 8進数long           %d %d \n",01234L,00L);
    printf(" 8進数unsigned       %u %u \n",01234u,00u);
    printf(" 8進数unsigned long  %u %u \n",01234ul,00ul);
}

結果、次のように表示されたと思います。

10進数int 1234 0 -45
10進数long 1234 0 -45
10進数unsigned 1234 0
10進数unsigned long 1234 0
16進数int 4660 0
16進数long 4660 0
16進数unsigned 4660 0
16進数unsigned long 4660 0
 8進数int 668 0
 8進数long 668 0
 8進数unsigned 668 0
 8進数unsigned long 668 0

16進数で1234は10進数で4660、
8進数で1234は10進数で668になるのでこのようになります。

今回uとLの意味があまり無いようなプログラムを組んでしまいましたが、
通常のintではオーバーフロー(数値が範囲を超えて溢れ出す)するような数値を代入する時につかうといいでしょう。
(別に使わなくても32ビットシステムではエラーにならないと思いますが)

◆浮動小数(実数)定数

今日は浮動小数(実数)定数の記述について、

基本的には小数点が必要です。小数点を付け忘れると整数とみなされ、
実数型の変数に代入する時にデータ型が合わないと『警告』が出る場合があります。

それでは通常に小数点を付けた数値を記述した場合、

1234.5678

上の場合通常double型とみなされます。このままfloat型変数に代入すると『警告』が出されることがあります。先週のプログラムで『警告』がでるのはこれが原因です。

じゃあfloat型変数に代入するためには?
接尾語としてf,Fを付けます。

1234.5678f

これでOKです。

また、浮動小数を記述するのに指数形式で表現したい時もあります。
そんなときは、e,Eをつかって

1.001e13
6e4
-2.345e-12

のように表せます。
1番目は1.001×10の13乗
2番目は6.0×10の4乗
3番目は-2.345×10の-12乗

です。

ただし、1つ注意点があります。

それは、

1234.5678L

のように小数点付きの定数にLをつけるとlong doubleになるということです。
long doubleというデータ型はシステムによっては無いと思われるのでメルマガでは紹介していませんが、doubleのさらに高精度のデータ型です。

ということで今日のおさらい

#include<stdio.h>

main()
{
    printf("double %f\n",1234.5678);
    printf("float  %f\n",1234.5678f);
    printf("double %f\n",1.001e13);
    printf("double %f\n",6e4);
    printf("double %f\n",-2.345e-2);
    printf("long double %f\n",1234.5678L);
}

このプログラムを実行すると次のように表示されます。
(システムによって違うかも…)

double 1234.567800
float 1234.567749
double 10010000000000.000000
double 60000.000000
double -0.023450
long double 1234.567800

◆文字定数

ところで文字が定数であると言うのはどういう意味でしょうか?

文字はコンピューターの中で『文字コード番号』に基づいて処理されています。

というわけで、文字定数は最終的に文字コード番号のことをさします。

しかし、文字を入力するのにいちいち文字コードを使うのは現実的ではありません。

そこで、C言語では対象とする文字の両脇に(‘)クォーテーションを付けることによって、文字定数を記述することが出来ます。

たとえば、

‘A’ ‘t’ ‘8’ ‘f’

これらはすべて文字定数です。(8も数値ではなく文字として扱われます)
ただし、次のものは文字定数にはなりません。

‘ABCDEFGH’
‘漢’

上の’ABCDEFGH’は文字列なので文字定数になりません。また’漢’も文字列になります。

なぜ?

文字定数はchar型変数1つ分のデータ長でなければいけません。
もちろん、全角文字はchar2つ分のデータが必要なので文字定数にはならないのです。

そういうことで使えるのは1バイト文字だけになります。
ASCIIコードと1バイトのJISコードだけが使用可能です。
それでもJISコードを使用するときは、unsigned char型である必要があります。
それは半角カタカナ等が(161~223)に定義されているためです。

では早速表示させて見ましょう。

#include<stdio.h>

main()
{
    printf("%c",'A');
    printf("%c",'B');
    printf("%c",'C');
    printf("%c",'D');
    printf("%c",'E');
}

これを実行すると

ABCDE

と表示されたと思います。次は ‘ を表示させて見ましょう。

しかし、両端に’を使用するので通常の方法では’を表示できません。
文字コードで表示させる方法もありますが、ここでは前にやったエスケープシーケンスを使って表示させましょう。

#include<stdio.h>

main()
{
    printf("%c",'\'');
}

これでOKです。

文字定数にはエスケーシーケンスが使える

ということです。

あと文字列定数と呼ばれているものもありますが、『配列』の時にしようと考えています。