データ型については第2章で説明しましたが、この章では、データ型の修飾について説明します。
既に学習した「long」はサイズを修飾するものです。 実は「long」は「long int」を略した記述で、その意味は「int型と同じかそれより大きい」となります。
同様に「int型と同じかそれより小さい」を表す「short」(short int の略)も存在します。
ANSI C では short と long のバイト幅は処理系に任されており、以下のようにのみ規定しています。
short int ≦ int ≦ long int
short int は short と記述可能
long int は long と記述可能
float ≦ double ≦ long double
バイト幅は処理系により異なり、共通サイズのデータ型は 1バイト幅の「char型」だけです。
特に「int型」は「対象となっているマシン環境で、最も効率よく処理できる整数幅を int型に割り当てる」とことになっており、処理系によって異なります。
このホームページでは、MS-DOS系のC言語で用いられている「int幅 = 2バイト」を採用しています。その他の処理系のC言語を利用している人は、自分の環境に合わせて読みかえるようにしてください。また、データサイズがわからない場合には「sizeof演算子」を使うなどして確認するようにしてください。
short や int などの整数型の変数は、符号修飾をすることができます。
単に「short」や「int」としたときは
「符号つき…負の値も扱える」
です。
これは、「符号つき…負の値も扱える」という修飾 「signed」を付けて、「signed short」や「signed int」とすべきところを「signed」を省略して単に「short」や「int」とした場合です。
これに対し、「unsigned」をつけて「unsigned short」や「unsigned int」とした場合には
「符号なし…正の値のみを扱う」
となります。
「unsigned」を用いると、符号ビットを数値として使うため、扱える数値の範囲が倍になります。 このため、unsigned は「負数は必要ない。その代わり正数をもっと表現したい。」という場合に用います。
※ 単にcharとした場合、符号つきか符号なしかは処理系に任されます。
変数の宣言は基本的には、
記憶クラス 型修飾子(符号修飾子、サイズ修飾子) データ型 変数名;
という順番で行います。このとき、緑色部分は省略ができます。
記憶クラス | 符号修飾子 | サイズ修飾子 | 基本型指定 |
---|---|---|---|
auto static |
signed unsigned |
short long |
int |
(注) 記憶クラスの「auto」と「static」については「第12章 記憶クラス」を参照してください。 また、記憶クラスの「register」と「extern」はこのホームページでは扱いません。
記憶クラス | サイズ修飾子 | 基本型指定 |
---|---|---|
auto static |
float | |
long | double |
「2-1. 定数」で定数の表記方法について扱いましたが、実は定数も接尾語を付加することにより、サイズ修飾と符号修飾が行えるのです。
ここでは、定数のサイズ修飾と符号修飾についてまとめます。
整数定数は、接尾語の u または U を 付けると「unsigned型」に、接尾語の l または L を付けると「long型」になります。
記述例 | 符号 | 意味 | 意味規則(注1) | |
---|---|---|---|---|
接尾語無し | 46 | あり | int型 10進定数 | int => long => unsigned long |
056 | int型 8進定数 | int => unsigned => long => unsigned long | ||
0x2e 0X2e | int型 16進定数 | |||
u/U接尾語付き | 0141520u 0141520U | なし | unsigned型 8進定数 | unsigned => unsigned long |
50000u 50000U | unsigned型 10進定数 | |||
0xC350u 0xC350U | unsigned型 16進定数 | |||
l/L接尾語付き (注2) | 0141520L | あり | long型 8進定数 | long => unsigned long |
50000L | long型 10進定数 | |||
0xC350L | long型 16進定数 | |||
l/L u/U接尾語付き (注3) | 0303240UL 0303240LU | なし | unsigned long型 8進定数 | unsigned long |
100000UL 100000LU | unsigned long型 10進定数 | |||
0x186A0UL 0x186A0LU | unsigned long型 16進定数 |
(注1) 整数定数は値の大きさによって、サイズと符号の扱いが変わります。 例えば、int型 2バイトの処理系ですと接尾語無し定数は、 10 : intで扱う 50000 : longで扱う 3000000000 : unsigned longで扱う というように、値の大きさによって、扱われる型が変化していきます。 (注2) 接尾語「l」も使えますが、「1」と間違えないように「L」を使いましょう。 (注3) L と U の順序はどちらが先でもかまいません。
浮動小数点定数は、接尾語の f または F を 付けると「float型」に、接尾語の l または L を付けると「long double型」になります。
記述例 | 意味 | |
---|---|---|
接尾語無し | 30.0, .5, 1. | double型 |
30.0e3, 30.0e+3, 30.0E3, 30.0E+3, 30.0e-3, 30.0E-3 | double型(30.0×103) double型(30.0×10-3) | |
f/F接尾語付き | 30.0F, .5F, 1.F, 30.0e-3F, 30.0E-3F | float型 |
l/L接尾語付き (注1) | 30.0L, .5L, 1.L, 30.0e-3L, 30.0E-3L | long double型 |
(注1) 接尾語「l」も使えますが、「1」と間違えないように「L」を使いましょう。
C言語の処理系は、1バイトのビット数や汎整数型の最大値と最小値などをlimits.h ヘッダにマクロ(#define)で定義しています。
limits.h ヘッダ中のマクロ
C言語の処理系は、浮動小数点型の最大値と最小値などをfloat.h ヘッダにマクロで定義しています。
float.h ヘッダ中のマクロ
「初心者のためのポイント学習C言語」 Copyright(c) 2000-2004 TOMOJI All Rights Reserved