この項では,CC-RHが扱うデータのそれぞれの型における,内部表現と値域について説明します。
領域の左端ビットは,符号付きの型(“unsigned”を伴わずに宣言された型)では,符号ビットとなります。符号付きの型において,値は2の補数表現で表されます。
整数型の内部表現を以下に示します。
ゼロビット目のみが意味を持ちます。1~7ビット目は不定値となります。
-lang=cオプションと-strict_stdオプションを同時に指定している場合は,_Bool型はC90違反でエラーとなります。
- | signed char(unsignedでは符号ビットなし) |
- | short(unsignedでは符号ビットなし) |
- | int,long(unsignedでは符号ビットなし) |
- | long long(unsignedでは符号ビットなし) |
-lang=cオプションと-strict_stdオプションを同時に指定している場合は,long long型はC90違反でエラーとなります。
|
|
char
|
-128~+127
|
short
|
-32768~+32767
|
int
|
-2147483648~+2147483647
|
long
|
-2147483648~+2147483647
|
long long
|
-9223372036854775808~+9223372036854775807
|
unsigned char
|
0~255
|
unsigned short
|
0~65535
|
unsigned int
|
0~4294967295
|
unsigned long
|
0~4294967295
|
unsigned long long
|
0~18446744073709551615
|
整数定数の型は,次の並びのうちでその値を表現できる最初の型となります。
表 4.2 | 整数定数の型(-lang=c指定あり,-strict_std 指定なし) |
|
|
|
なし
|
int
long int
unsigned long int注
long long int
unsigned long long int
|
int
unsigned int
long int
unsigned long int
long long int
unsigned long long int
|
u,またはU
|
unsigned int
unsigned long int
unsigned long long int
|
unsigned int
unsigned long int
unsigned long long int
|
l,またはL
|
long int
unsigned long int注
long long int
unsigned long long int
|
long int
unsigned long int
long long int
unsigned long long int
|
u,またはU,およびl ,またはL の両方
|
unsigned long int
unsigned long long int
|
unsigned long int
unsigned long long int
|
ll,またはLL
|
long long int
unsigned long long int
|
long long int
unsigned long long int
|
u,またはU,およびll ,またはLLの両方
|
unsigned long long int
|
unsigned long long int
|
表 4.3 | 整数定数の型(-lang=c指定あり,-strict_std 指定あり) |
|
|
|
なし
|
int
long int
unsigned long int
|
int
unsigned int
long int
unsigned long int
|
u,またはU
|
unsigned int
unsigned long int
|
unsigned int
unsigned long int
|
l,またはL
|
long int
unsigned long int
|
long int
unsigned long int
|
u,またはU,およびl ,またはL の両方
|
unsigned long int
|
unsigned long int
|
表 4.4 | 整数定数の型(-lang=c99指定あり) |
|
|
|
なし
|
int
long int
long long int
unsigned long long int
|
int
unsigned int
long int
unsigned long int
long long int
unsigned long long int
|
u,またはU
|
unsigned int
unsigned long int
unsigned long long int
|
unsigned int
unsigned long int
unsigned long long int
|
l,またはL
|
long int
long long int
unsigned long long int
|
long int
unsigned long int
long long int
unsigned long long int
|
u,またはU,およびl,またはLの両方
|
unsigned long int
unsigned long long int
|
unsigned long int
unsigned long long int
|
ll,またはLL
|
long long int
unsigned long long int
|
long long int
unsigned long long int
|
u,またはU,およびll,またはLLの両方
|
unsigned long long int
|
unsigned long long int
|
浮動小数点型データの内部表現は,IEEE754注に準拠しています。領域の左端のビットは,符号ビットとなります。この符号ビットの値が0であれば正の値に,1であれば負の値になります。
注 | IEEE:Institute of Electrical and Electronics Engineers(電気電信学会)の略称です。
また,IEEE754とは,浮動小数点演算を扱うシステムにおいて,扱うデータ形式や数値範囲などの仕様の統一化を図った標準です。 |
浮動小数点型の内部表現を以下に示します。
S: 仮数部の符号ビット
E: 指数部(5ビット)
M: 仮数部(10ビット)
S: 仮数部の符号ビット
E: 指数部(8ビット)
M: 仮数部(23ビット)
S: 仮数部の符号ビット
E: 指数部(11ビット)
M: 仮数部(52ビット)
|
|
__fp16
|
6.10352e-05F~65504.0
|
float
|
1.17549435E-38F~3.40282347E+38F
|
double
|
2.2250738585072014E-308~1.7976931348623158E+308
|
long double
|
2.2250738585072014E-308~1.7976931348623158E+308
|
-Xdbl_size=4指定時は,double,long double型はfloat型と同じ内部表現,値域を持ちます。
ポインタ型の内部表現は,unsigned int型の内部表現と同じです。
列挙型の内部表現は,singed int型の内部表現と同じです。領域の左端のビットは,符号ビットとなります。
-Xenum_type=autoオプション指定時には,「(32) 列挙型の値を表現するために選択される整数型(6.5.2.2)。」を参照してください。
配列型の内部表現は,配列の要素を,その要素の整列条件(alignment)を満たす形で並べたものとなります。
char a[8] = {1, 2, 3, 4, 5, 6, 7, 8};
|
上記の例に示した配列に対する内部表現は,次のようになります。
構造体型の内部表現は,構造体の要素をその要素の整列条件を満たす形で並べたものとなります。
struct {
short s1;
int s2;
char s3;
int s4;
} tag;
|
この例に示した構造体に対する内部表現は,次のようになります。
なお,構造体パッキング機能利用時の内部表現は,「4.2.6.8 構造体パッキング」を参照してください。
共用体はそのメンバがすべてオフセット0から始まり,そのメンバの任意のものを収容するのに十分なサイズを持つ構造体と考えられます。つまり,共用体型の内部表現は,同じアドレスに共用体の要素それぞれが単体で置かれているのと同様です。
union {
int u1;
short u2;
char u3;
long u4;
} tag;
|
この例に示した共用体に対する内部表現は,次のようになります。
ビット・フィールドに対しては,宣言された数のビットを含む領域が取られます。符号付きの型として,または符号を明示せずに宣言されたビット・フィールドに対しては,最上位ビットは符号ビットとなります。
最初に宣言されたビット・フィールドは,ビット・フィールド宣言時の型のサイズの領域の最下位ビットから割り当てられます。ビット・フィールドに対し,その前のビット・フィールドに続けて領域を割り当てると,その領域がそのビット・フィールドの宣言において指定された型の整列条件を満たす境界を越えてしまう場合,そのビット・フィールドに対する領域はその整列条件を満たしている境界から割り当てられます。
-Xbit_order=leftオプション,または#pragma bit_order leftを指定することで,ビット・フィールド・メンバを上位ビット側から割り当てることも可能です。詳細は,「4.2.6.9 ビット・フィールドの割り付け」を参照してください。
struct {
unsigned long f1:30;
int f2:14;
unsigned int f3:6;
} flag;
|
この例に示したビット・フィールドに対する内部表現は,次のようになります
struct {
int f1:5;
char f2:4;
int f3:6;
} flag;
|
この例に示したビット・フィールドに対する内部表現は,次のようになります
ビット・フィールドには_Bool,char,signed char,unsigned char,signed short,unsigned short,signed int,unsigned int,signed long,unsigned long,signed long long,unsigned long long,および列挙型を指定することができます。ただし,-lang=cオプションおよび-strict_stdオプション指定時は,int型と,unsigned int型のみを指定することができます。
なお,構造体パッキング機能利用時のビット・フィールドの内部表現は,「4.2.6.8 構造体パッキング」を参照してください。
次に,基本型に対する整列条件を示します。
ただし,CC-RHの-Xinline_strcpyを指定した場合,配列型はすべて4バイト境界となります。
|
|
(unsigned)charとその配列型
_Bool型
|
バイト境界
|
(unsigned)shortとその配列型
|
2バイト境界
|
(ポインタを含む)その他の基本型
(unsigned) long longとその配列型
doubleとその配列型
|
4バイト境界
|
long doubleとその配列型
|
4バイト境界
|
共用体型に対する整列条件は,構造体を構成するメンバのうち,最大の整列条件をもつ型の整列条件と同じになります。
それぞれの場合における例を示します。
union tug1 {
unsigned short i; /*2バイト・メンバ*/
unsigned char c; /*1バイト・メンバ*/
}; /*共用体は2バイトで整列*/
|
union tug2 {
unsigned int i; /*4バイト・メンバ*/
unsigned char c; /*1バイト・メンバ*/
}; /*共用体は4バイトで整列*/
|
構造体型に対する整列条件は,構造体を構成するメンバのうち,最大の整列条件をもつ型の整列条件と同じになります。
それぞれの場合における例を示します。
struct ST {
char c; /*1バイト・メンバ*/
}; /*構造体は1バイトで整列*/
|
struct ST {
char c; /*1バイト・メンバ*/
short s; /*2バイト・メンバ*/
}; /*構造体は2バイトで整列*/
|
struct ST {
char c; /*1バイト・メンバ*/
short s; /*2バイト・メンバ*/
short s2; /*2バイト・メンバ*/
}; /*構造体は2バイトで整列*/
|
struct ST {
char c; /*1バイト・メンバ*/
short s; /*2バイト・メンバ*/
int i; /*4バイト・メンバ*/
}; /*構造体は4バイトで整列*/
|
struct ST {
char c; /*1バイト・メンバ*/
short s; /*2バイト・メンバ*/
int i; /*4バイト・メンバ*/
long long ll; /*4バイト・メンバ*/
}; /*構造体は4バイトで整列*/
|
関数引数に対する整列条件は,4バイト境界となります。
リロケータブルなオブジェクト・ファイルをリンクして実行可能なオブジェクト・ファイルを生成する際の整列条件は,2バイト境界となります。