この項では,CC-RLが扱うデータのそれぞれの型における,内部表現と値域について説明します。
領域の左端ビットは,符号付きの型では,符号ビットとなります。符号付きの型において,値は2の補数表現で表されます。
ゼロビット目のみが意味を持ちます。1〜7ビット目は不定値となります。
オプション-lang=cかつ-strict_std使用時は,_Bool型はC90違反でエラーとなります。
signed もunsigned もつかない単なるchar 型は,unsigned char と同じ表現とします。
ただし,オプション-signed_char 使用時は,signed char と同じ表現とします。
signed char(unsignedでは符号ビットなし)
オプション-lang=cかつ-strict_std使用時は,long long型はC90違反でエラーとなります。
浮動小数点型データの内部表現は,IEC 60559:1989 (IEEE 754-1985)注に準拠しています。領域の左端のビットは,符号ビットとなります。この符号ビットの値が0であれば正の値に,1であれば負の値になります。
IEEE:Institute of Electrical and Electronics Engineers(電気電信学会)の略称です。 |
オプション-dbl_size=4使用時はfloat型と同じ表現とします。double型を書いてもfloat型を書いたものとして扱います。long double型も同様にfloat型を書いたものとして扱います。
オプション-dbl_size=8使用時は,64ビットで表現されます。
nearポインタの内部表現は16ビットの符号なし型,farポインタの内部表現は32ビットの符号なし型となります。
空ポインタ定数(NULL)の内部表現は値0となります(ただし,farポインタの不定値部分は0とは限りません)。
このため,near ポインタ,far ポインタ共にゼロ番地に対するアクセスは保証しません。
farポインタの値が0xfffffを越えた場合の動作は保証しません。
0x0f0000番地に関数や変数を配置したり,アクセスすることはしないでください。
配列型の内部表現は,配列の要素を,その要素の整列条件(alignment)を満たす形で並べたものとなります。
上記の例に示した配列に対する内部表現は,次のようになります。
ひとつの構造体において,各メンバは構造体先頭から宣言順に配置されます。構造体型の内部表現は,構造体の要素をその要素の整列条件を満たす形で並べたものとなります。
構造体全体の整列条件は,その構造体で最も大きなメンバの整列条件に合わせたものとなります。このルールは,メンバが構造体や共用体の場合にも再帰的に適用されます。
構造体のサイズは「構造体全体の整列条件」の倍数となります。したがって,構造体の末尾が構造体自身の整列条件とあわない場合に次の整列条件を保証するために作成される未使用領域もサイズに含まれます。
この例に示した構造体に対する内部表現は,次のようになります。
この例に示した構造体に対する内部表現は,次のようになります。
構造体パッキング指定については,「-pack」を参照してください。
共用体全体の整列条件は,その共用体で最も大きなメンバの整列条件に合わせたものとなります。このルールは,メンバが構造体や共用体の場合にも再帰的に適用されます。
この例に示した共用体に対する内部表現は,次のようになります。
ビット・フィールドには_Bool,char,signed char,unsigned char,signed short,unsigned short,signed int,unsigned int,signed long,unsigned long,signed long long,unsigned long long,および列挙型を指定することができます。
C90では(signed/unsigned)int 型のみ許されていますが,CC-RLではオプション-strict_stdを使用しない場合,上記の型を全てビット・フィールドに対して有効とします。オプション-strict_stdを使用する場合,_Bool,signed long long,unsigned longl long型はC90違反でエラーとします。
ビット・フィールドは,宣言した型の最下位ビットから割り当てます。
ビット・フィールドを直前のビット・フィールドに続くビットから配置すると,配置後のビット・フィールドの末尾の位置が,ビット・フィールドの整列条件を満たす直前の境界に「宣言した型のビット幅」を加えた位置を超える場合,そのビット・フィールドは直前のビット・フィールド以降にあるビット・フィールドの整列条件を満たす最初の境界に整列します。
struct S{ char a; char b:2; signed char c:3; unsigned char d:4; int e; short f:5; int g:6; unsigned char h:2; unsigned int i:2; }; |
この例に示したビット・フィールドに対する内部表現は,次のようになります。
この例に示したビット・フィールドに対する内部表現は,次のようになります。
この例に示したビット・フィールドに対する内部表現は,次のようになります。
構造体パッキング指定については,「-pack」を参照してください。
配列型に対する整列条件は,配列要素の整列条件と同じになります。
nearポインタ,farポインタに対する整列条件は,2となります。
共用体型に対する整列条件は,共用体を構成するメンバのうち,最大の整列条件をもつ型の整列条件と同じになります。
構造体型に対する整列条件は,構造体を構成するメンバのうち,最大の整列条件をもつ型の整列条件と同じになります。
「9.1 関数呼び出しインタフェース」を参照してください。