基本型

提供: Appmethod Topics
移動先: 案内検索

宣言構文:インデックス への移動


基本型指定子は以下のキーワードで構成されます。

CHAR

__int8

LONG

DOUBLE

__int16

Signed

FLOAT

__int32

Short

INT

__int64

符号なし

これらのキーワードから整数型と浮動小数点型を構成することができ、それらを総称して算術型と呼びます。 longshortsignedunsigned の各修飾子は、整数型に適用することができます。 インクルード ファイル limits.h には、すべての基本型の値の範囲が定義されています。

整数型

charshortintlong、およびそれらの符号なし(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
(ISO C99、C++0x)

unsigned long long、unsigned long long int
(ISO C99、C++0x)

メモ: これらのシノニムは C++ では無効です。 「3 種類の文字型」を参照してください。

signed または unsigned は、charshortintlong のいずれかにのみ適用することができます。 キーワード signed および unsigned を単独で使用した場合は、それぞれ signed int および unsigned int を意味します。

unsigned が指定されていなければ、整数型は通常 signed とみなされます。 ただし、char の場合は例外です。 char のデフォルトを signed または unsigned にすることができます (明示的に設定しない場合は、signed がデフォルトになります)。 デフォルトが unsigned になっている場合は、"char ch" という宣言によって ch は unsigned として宣言されることになります。 このデフォルトを無効にするには、"signed char ch" を使用する必要があります。 同様に、signedchar のデフォルトである場合は、unsigned char を宣言するには、明示的に "unsigned char ch" と指定する必要があります。

int の場合は、long または short のみ指定することができます。 キーワード long および short を単独で使用した場合は、それぞれ long int および short int を意味します。

ANSI C 規格では、"short <= int <= long" という表現で、shortintlong の順にサイズが大きくなるか同じであると指定しているだけで、これらの型のサイズや内部表現については規定していません。 これら 3 つの型がすべて同じである場合も、規格上はあり得ます。 このことは、他のプラットフォームに移植可能なコードを作成する場合には重要です。

コンパイラは int 型と long 型を同等とみなし、両方とも 32 ビットになります。 符号付き(signed)のものはすべて、最上位ビット(MSB)を符号ビット(正の場合 0、負の場合 1)に使って 2 の補数形式で格納されます(「32 ビット データ型、サイズ、および範囲」の表に示されているような範囲になるのはそのためです)。 符号なし(unsigned)の型では、すべてのビットを使用して 0 ~ (2^n - 1) の範囲の値を表します(ここで、 ^ はべき乗、n は 8、16、32 です)。

浮動小数点型

浮動小数点型の内部表現と値セット(値の範囲)は処理系に依存します。 つまり、C 言語の実装ごとに、それらを自由に定義できます。 コンパイラでは IEEE 浮動小数点形式を使用しています。 トピック「ANSI 処理系固有規格」を参照してください。

floatdouble はそれぞれ、32 ビットと 64 ビットの浮動小数点データ型です。 longdouble と組み合わせて使用すると、80 ビットの精密な浮動小数点識別子を宣言することができます。 たとえば、"long double test_case" のように指定します。

浮動小数点型の記憶領域割り当てについては、「ビット データ型、サイズ、および範囲」の表を参照してください。

標準の算術変換

a と b が異なる算術型である場合の a + b のような算術式を使用した場合、コンパイラは式を評価する前に、ある内部変換を行います。 こうした標準の変換では、正確さと整合性を確保するため "下位" の型から "上位" の型への昇格が行われます。

コンパイラで算術式内のオペランドを変換する際に用いられる手順は以下のとおりです。

  1. 小さい整数型はすべて、「基本型」における「標準の算術変換で用いられる方法」の表に示すように変換されます。 その結果、演算子に関係する 2 つの値はすべて、intlong および unsigned 修飾子も含む)、doublefloatlong double のいずれかになります。
  2. 一方のオペランドが long double 型であれば、もう一方のオペランドは long double に変換されます。
  3. 上記に該当しない場合、一方のオペランドが double 型であれば、もう一方のオペランドは double に変換されます。
  4. 上記にも該当しない場合、一方のオペランドが float 型であれば、もう一方のオペランドは float に変換されます。
  5. 上記にも該当しない場合、一方のオペランドが unsigned long 型であれば、もう一方のオペランドは unsigned long に変換されます。
  6. 上記にも該当しない場合、一方のオペランドが long 型であれば、もう一方のオペランドは long に変換されます。
  7. 上記にも該当しない場合、一方のオペランドが unsigned 型であれば、もう一方のオペランドは unsigned に変換されます。
  8. 上記にも該当しない場合は、どちらのオペランドも int 型になります。

式の結果は、2 つのオペランドの型と同じになります。

標準の算術変換で用いられる方法

種類 変換先 メソッド

CHAR

INT

ゼロあるいは符号拡張(char 型のデフォルトによる)

unsigned char

INT

上位バイトにゼロ充填(常時)

signed char

INT

符号拡張(常時)

Short

INT

同じ値(符号拡張)

unsigned short

unsigned int

同じ値(ゼロ充填)

列挙型

INT

同じ値

char、int、enum の特殊な変換

メモ: このセクションで論じている変換は、Appmethod C++ の bcc32.exe コンパイラに固有のものです。

符号付き文字オブジェクト(変数など)を整数オブジェクトに代入すると、自動的に符号拡張が行われます。 signed char 型のオブジェクトでは常に符号拡張が用いられ、unsigned char 型のオブジェクトでは、int への変換時に上位バイトが常にゼロに設定されます。

サイズの大きい整数型をサイズの小さい型に変換すると、上位ビットは切り捨てられ、下位ビットはそのままです。 サイズの小さい整数型をサイズの大きい型に変換する場合は、元の型が signedunsigned かに応じて、新しい値の残りの上位ビットには符号拡張(前者の場合)かゼロ充填(後者の場合)が行われます。

関連項目