基本型
宣言構文:インデックス への移動
基本型指定子は以下のキーワードで構成されます。
char |
__int8 |
long |
double |
__int16 |
signed |
float |
__int32 |
short |
int |
__int64 |
unsigned |
これらのキーワードから整数型と浮動小数点型を構成することができ、それらを総称して算術型と呼びます。 long、short、signed、unsigned の各修飾子は、整数型に適用することができます。 インクルード ファイル limits.h には、すべての基本型の値の範囲が定義されています。
整数型
char、short、int、long、およびそれらの符号なし(unsigned)データ型はすべて、整数型とみなされます。以下の表では、整数型指定子を、シノニム(同義の型指定子)と共に示してあります。
char、signed char |
これらがシノニムになるのは、char のデフォルトが signed の場合。 |
unsigned char |
|
char、unsigned char |
これらがシノニムになるのは、char のデフォルトが unsigned の場合。 |
signed char |
|
int、signed int |
|
unsigned、unsigned int |
|
short、short int、signed short int |
|
unsigned short、unsigned short int |
|
long、long int、signed long int |
|
unsigned long、unsigned long int |
|
signed long long、long long int |
|
unsigned long long、unsigned long long int |
メモ: これらのシノニムは C++ では無効です。 「3 種類の文字型」を参照してください。
signed または unsigned は、char、short、int、long のいずれかにのみ適用することができます。 キーワード signed および unsigned を単独で使用した場合は、それぞれ signed int および unsigned int を意味します。
unsigned が指定されていなければ、整数型は通常 signed とみなされます。 ただし、char の場合は例外です。 char のデフォルトを signed または unsigned にすることができます (明示的に設定しない場合は、signed がデフォルトになります)。 デフォルトが unsigned になっている場合は、"char ch" という宣言によって ch は unsigned として宣言されることになります。 このデフォルトを無効にするには、"signed char ch" を使用する必要があります。 同様に、signed が char のデフォルトである場合は、unsigned char を宣言するには、明示的に "unsigned char ch" と指定する必要があります。
int の場合は、long または short のみ指定することができます。 キーワード long および short を単独で使用した場合は、それぞれ long int および short int を意味します。
ANSI C 規格では、"short <= int <= long" という表現で、short、int、long の順にサイズが大きくなるか同じであると指定しているだけで、これらの型のサイズや内部表現については規定していません。 これら 3 つの型がすべて同じである場合も、規格上はあり得ます。 このことは、他のプラットフォームに移植可能なコードを作成する場合には重要です。
コンパイラは int 型と long 型を同等とみなし、両方とも 32 ビットになります。 符号付き(signed)のものはすべて、最上位ビット(MSB)を符号ビット(正の場合 0、負の場合 1)に使って 2 の補数形式で格納されます(「32 ビット データ型、サイズ、および範囲」の表に示されているような範囲になるのはそのためです)。 符号なし(unsigned)の型では、すべてのビットを使用して 0 ~ (2^n - 1) の範囲の値を表します(ここで、 ^ はべき乗、n は 8、16、32 です)。
浮動小数点型
浮動小数点型の内部表現と値セット(値の範囲)は処理系に依存します。 つまり、C 言語の実装ごとに、それらを自由に定義できます。 コンパイラでは IEEE 浮動小数点形式を使用しています。 詳細は、「ANSI 処理系固有規格」の事項に関するトピックを参照してください。
float と double はそれぞれ、32 ビットと 64 ビットの浮動小数点データ型です。 long を double と組み合わせて使用すると、80 ビットの精密な浮動小数点識別子を宣言することができます。 たとえば、"long double test_case" のように指定します。
浮動小数点型の記憶領域割り当てについては、「32 ビット データ型、サイズ、および範囲」の表を参照してください。
標準の算術変換
a と b が異なる算術型である場合の a + b のような算術式を使用した場合、コンパイラは式を評価する前に、ある内部変換を行います。 こうした標準の変換では、正確さと整合性を確保するため "下位" の型から "上位" の型への昇格が行われます。
コンパイラで算術式内のオペランドを変換する際に用いられる手順は以下のとおりです。
- 小さい整数型はすべて、「基本型」の表「標準の算術変換で用いられる方法」に示すように変換されます。 その結果、演算子に関係する 2 つの値はすべて、int(long および unsigned 修飾子も含む)、double、float、long double のいずれかになります。
- 一方のオペランドが long double 型であれば、もう一方のオペランドは long double に変換されます。
- 上記に該当しない場合、一方のオペランドが double 型であれば、もう一方のオペランドは double に変換されます。
- 上記にも該当しない場合、一方のオペランドが float 型であれば、もう一方のオペランドは float に変換されます。
- 上記にも該当しない場合、一方のオペランドが unsigned long 型であれば、もう一方のオペランドは unsigned long に変換されます。
- 上記にも該当しない場合、一方のオペランドが long 型であれば、もう一方のオペランドは long に変換されます。
- 上記にも該当しない場合、一方のオペランドが unsigned 型であれば、もう一方のオペランドは unsigned に変換されます。
- 上記にも該当しない場合は、どちらのオペランドも int 型になります。
式の結果は、2 つのオペランドの型と同じになります。
標準の算術変換で用いられる方法
タイプ | 変換先 | メソッド |
---|---|---|
char |
int |
ゼロあるいは符号拡張(char 型のデフォルトによる) |
unsigned char |
int |
上位バイトにゼロ充填(常時) |
signed char |
int |
符号拡張(常時) |
short |
int |
同じ値(符号拡張) |
unsigned short |
unsigned int |
同じ値(ゼロ充填) |
enum |
int |
同じ値 |
char、int、enum の特殊な変換
メモ: このセクションで論じている変換は、C++Builder bcc32.exe コンパイラに固有のものです。
符号付き文字オブジェクト(変数など)を整数オブジェクトに代入すると、自動的に符号拡張が行われます。 signed char 型のオブジェクトでは、常に符号拡張が持ち入れられ、unsigned char 型のオブジェクトでは、int への変換時に上位バイトが常にゼロに設定されます。
サイズの大きい整数型をサイズの小さい型に変換すると、上位ビットは切り捨てられ、下位ビットはそのままです。 サイズの小さい整数型をサイズの大きい型に変換する場合は、元の型が signed か unsigned かに応じて、新しい値の残りの上位ビットには符号拡張(前者の場合)かゼロ充填(後者の場合)が行われます。