データ型


1.C言語の変数の型

 
「入力と計算」の章で、C言語の変数の基本的な型の一部を紹介しました。ここでは、残りの基本データ型の説明をします。

変数の基本データ型
説明
char 1バイトの符号付整数(-128〜127)の値を記憶できる.
1バイト文字(英数字など)を1字記憶できる
unsigned char 1バイトの符号なし整数(0〜255)の値を記憶できる
int 2または4バイトの符号付整数の値を記憶できる
(2バイトなら-2の15乗〜2の15乗-1、
4バイトなら-2の31乗〜2の31乗-1)
short 2バイトの符号付整数(-2の15乗〜2の15乗-1)の値を記憶できる
long 4バイトの符号付整数(-2の31乗〜2の31乗-1)の値を記憶できる
unsigned 2バイトまた4バイトの符号なし整数の値を記憶できる
(2バイトなら0〜2の16乗-1、4バイトなら0〜2の32乗-1)
unsigned long 4バイトの符号なし整数(0〜2の32乗-1)の値を記憶できる
unsigned short 2バイトの符号なし整数(0〜2の16乗-1)の値を記憶できる
float 4バイトの単精度浮動小数点実数(有効桁数7桁)
double 8バイトの倍精度浮動小数点実数(有効桁数16桁)

【 注 】 int型、unsigned型は、コンパイラによって2バイト、4バイトと異なる。その点、long、shortを指定すれば、必ずshortなら2バイト、longなら4バイトになります。


2.C言語の定数の書き方

プログラム中で使用する定数の書き方を説明します。

定数の書き方
データの種類 書き方例 説明
文字 'a' 1バイト文字(英数字など)1文字
文字列 "abcd" 「"」で挟まれた文字の並び
整数 156 int型データとして扱われる
整数(8進) 033 先頭が「0」の場合は8進数として扱われる
整数(16進) 0x3f 先頭が「0x」の場合は16進数として扱われる
符号なし整数 358U 最後に「u」または「U」をつけると符号なし整数として扱われる
long型整数 1356L 最後に「l」または「L」をつけるとlong型整数として扱われる
実数 3.14F 最後に「f」または「F」を付けると
単精度浮動小数点実数(有効桁数7桁)として扱われる。
double型実数 12.4567 倍精度浮動小数点実数(有効桁数16桁)として扱われる。

【 注 】 たとえ1文字でも、"a"は文字列、 'a'は文字として扱われる。

3.異なる型データで演算すると…

 C言語で、異なる型のデータで演算をすると、どうなるのでしょうか?精度の低い型のデータが精度の高い型に合わされ、演算されます。
 例えば、・・・

「12 + 3.9」という演算の場合、12はint型、3.9はdouble型と見なされます。演算(計算)の際には、int型のデータの12をdouble型のデータに直して(12.0にして)、たされます。結果は、double型で15.9となります。

被演算子 被演算子 精度の高い方の型 結果の型
char int int int
short long long long
int float float float
int double double double
float double double dounle

【 例 】 12L * 2 + 4.0F * 2 + 3.14

12L * 2 + 4.0F * 2 + 3.14
1 long型 * int型 float型 * int型 double型
2 long型 * long型 float型 * float型
3 14L 8.0F
4 long型 + float型
5 float型 + float型
6 22.0F 3.14
7 float型 + double型
8 double型 + double型
9 25.14

「12L * 2」の計算は、long型とint型なので、2がlong型データに変換され、long型の掛け算が行われ、結果の24もlong型となります。次の「4.0F * 2」の計算は、float型とint型なので、2がfloat型に変換され、float型の掛け算が行われ、結果の8.0もfloat型となります。3の行の「14L + 8.0F」は、long型 + float型の計算なので、精度の高い「float型 + float型」の演算に変換され、答えはfloat型で22.0Fとなります。最後に、6の行の「22.0F + 3.14」は、float型 + double型の計算なので、精度の高い「double型 + double型」の演算に変換され、答えは25.14(double型)になります。


4.例題プログラム(rei6.c)

 このプログラムは、いろいろな型のデータを扱います。データの型に応じた書式指定を使っている点に注意してください。

rei6.c
/* いろいろなデータ型 */
#include <stdio.h>
main()
{
        printf("%d\n", 100);
        printf("%f\n", 1.2f);
        printf("%lf\n", 3.14);
        printf("%c\n", 'A');
        printf("%s\n", "Hello");
        printf("%x\n", 0x100);
        printf("%o\n", 0100);
}

 5行目は整数型定数100(百)を「%d」で10進整数として出力しています。
6行目はfloat型定数1.2(いってんに)を「%f」でfloat型実数として出力しています。
7行目はdouble型定数3.14(さんてんいちよん)を「%lf」double型実数として出力しています。
8行目は文字定数を「%c」で文字として出力しています。
9行目は文字列定数を「%s」で文字列として出力しています。
10行目は16進整数0x100(ゼロエックスイチゼロゼロ)を「%x」で16進整数として出力しています。
11行目は8進整数0100(ゼロイチゼロゼロ)を「%o」で8進整数として出力しています。

【 注 】 「%c」はprintf()関数の中で使用する出力書式のひとつで、データを1文字として(データを文字のコード番号として)出力してくれます。例えば、「A」という文字のコード番号は65なので、
   printf("%c\n", 65);
とすると、65というコード番号の文字「A」が出力されます。

【 注 】 「%s」はprintf()関数の中で使用する出力書式のひとつで、データを文字列として出力してくれます。C言語の文字列とは、文字コードの並びと最後の印のNULL(ナル)コードです。NULLコードには0が割り当てられています。したがって、"A"は、1文字のように見えても、「A」のコード番号65とNULLコード0とで2文字分の場所を取ります。一方、'A'は1文字の文字コードだけです。

    "A"…65, 0 2バイト(文字)分
    'A'…65   1バイト(文字)分


5.練習プログラム9(renshu9.c)

 実数の数値を整数型の変数に格納すると、小数部分が切り捨てられて整数部分だけが記憶されます。入力した実数の小数第一位を四捨五入して整数にして出力するプログラムを作りましょう。
(ヒント) int型変数に、x + 0.5の答えを格納します。

【 解答 】