4.1.5 データの内部表現と領域

この項では,CC-RHが扱うデータのそれぞれの型における,内部表現と値域について説明します。

(1)

整数型

(a)

内部表現

領域の左端ビットは,符号付きの型(“unsigned”を伴わずに宣言された型)では,符号ビットとなります。符号付きの型において,値は2の補数表現で表されます。

 

整数型の内部表現を以下に示します。

-

_Bool

ゼロビット目のみが意味を持ちます。1〜7ビット目は不定値となります。

-lang=cオプションと-strict_stdオプションを同時に指定している場合は,_Bool型はC90違反でエラーとなります。

 

-

char

 

-

signed char(unsignedでは符号ビットなし)

 

-

short(unsignedでは符号ビットなし)

 

-

int,long(unsignedでは符号ビットなし)

 

-

long long(unsignedでは符号ビットなし)

-lang=cオプションと-strict_stdオプションを同時に指定している場合は,long long型はC90違反でエラーとなります。

 

(b)

値域

表 4.9

整数型の値域

値域

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

(2)

浮動小数点型

(a)

内部表現

浮動小数点型データの内部表現は,IEEE754に準拠しています。領域の左端のビットは,符号ビットとなります。この符号ビットの値が0であれば正の値に,1であれば負の値になります。

IEEE:Institute of Electrical and Electronics Engineers(電気電信学会)の略称です。
また,IEEE754とは,浮動小数点演算を扱うシステムにおいて,扱うデータ形式や数値範囲などの仕様の統一化を図った標準です。

 

浮動小数点型の内部表現を以下に示します。

-

__fp16

S: 仮数部の符号ビット

E: 指数部(5ビット)

M: 仮数部(10ビット)

 

-

float

S: 仮数部の符号ビット

E: 指数部(8ビット)

M: 仮数部(23ビット)

 

-

double, long double

S: 仮数部の符号ビット

E: 指数部(11ビット)

M: 仮数部(52ビット)

 

(b)

値域

表 4.10

浮動小数点型の値域

値域

__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型と同じ内部表現,値域を持ちます。

(3)

ポインタ型

(a)

内部表現

ポインタ型の内部表現は,unsigned int型の内部表現と同じです。

図 4.1

ポインタ型の内部表現

 

(4)

列挙型

(a)

内部表現

列挙型の内部表現は,singed int型の内部表現と同じです。領域の左端のビットは,符号ビットとなります。

図 4.2

列挙型の内部表現

 

-Xenum_type=autoオプション指定時には,「(31) 列挙型指定子」を参照してください。

(5)

配列型

(a)

内部表現

配列型の内部表現は,配列の要素を,その要素の整列条件(alignment)を満たす形で並べたものとなります。

char    a[8] = {1, 2, 3, 4, 5, 6, 7, 8};

上記の例に示した配列に対する内部表現は,次のようになります。

図 4.3

配列型の内部表現

 

(6)

構造体型

(a)

内部表現

構造体型の内部表現は,構造体の要素をその要素の整列条件を満たす形で並べたものとなります。

struct {
    short   s1;
    int     s2;
    char    s3;
    int     s4;
} tag;

この例に示した構造体に対する内部表現は,次のようになります。

図 4.4

構造体型の内部表現

 

なお,構造体パッキング機能利用時の内部表現は,「4.2.4.8 構造体パッキング」を参照してください。

(7)

共用体型

(a)

内部表現

共用体はそのメンバがすべてオフセット0から始まり,そのメンバの任意のものを収容するのに十分なサイズを持つ構造体と考えられます。つまり,共用体型の内部表現は,同じアドレスに共用体の要素それぞれが単体で置かれているのと同様です。

union {
    int     u1;
    short   u2;
    char    u3;
    long    u4;
} tag;

この例に示した共用体に対する内部表現は,次のようになります。

図 4.5

共用体型の内部表現

 

(8)

ビット・フィールド

(a)

内部表現

ビット・フィールドに対しては,宣言された数のビットを含む領域が取られます。符号付きの型として,または符号を明示せずに宣言されたビット・フィールドに対しては,最上位ビットは符号ビットとなります。

最初に宣言されたビット・フィールドは,ビット・フィールド宣言時の型のサイズの領域の最下位ビットから割り当てられます。ビット・フィールドに対し,その前のビット・フィールドに続けて領域を割り当てると,その領域がそのビット・フィールドの宣言において指定された型の整列条件を満たす境界を越えてしまう場合,そのビット・フィールドに対する領域はその整列条件を満たしている境界から割り当てられます。

-Xbit_order=leftオプション,または#pragma bit_order leftを指定することで,ビット・フィールド・メンバを上位ビット側から割り当てることも可能です。詳細は,「4.2.4.9 ビット・フィールドの割り付け」を参照してください。

例 1.

struct {
    unsigned long   f1:30;
    int             f2:14;
    unsigned int    f3:6;
} flag;

この例に示したビット・フィールドに対する内部表現は,次のようになります

図 4.6

ビット・フィールドの内部表現

 

例 2.

struct {
    int             f1:5;
    char            f2:4;
    int             f3:6;
} flag;

この例に示したビット・フィールドに対する内部表現は,次のようになります

図 4.7

ビット・フィールドの内部表現

 

ビット・フィールドには_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.4.8 構造体パッキング」を参照してください。

(9)

整列条件

(a)

基本型に対する整列条件

次に,基本型に対する整列条件を示します。

ただし,CC-RHの-Xinline_strcpyを指定した場合,配列型はすべて4バイト境界となります。

表 4.11

基本型に対する整列条件

基本型

整列条件

(unsigned)charとその配列型

_Bool型

バイト境界

(unsigned)shortとその配列型

2バイト境界

(ポインタを含む)その他の基本型

(unsigned) long longとその配列型

doubleとその配列型

4バイト境界

long doubleとその配列型

4バイト境界

(b)

共用体型に対する整列条件

共用体型に対する整列条件は,構造体を構成するメンバのうち,最大の整列条件をもつ型の整列条件と同じになります。

 

それぞれの場合における例を示します。

例 1.

union   tug1 {
    unsigned short  i;  /*2バイト・メンバ*/
    unsigned char   c;  /*1バイト・メンバ*/
};  /*共用体は2バイトで整列*/

例 2.

union   tug2 {
    unsigned int    i;  /*4バイト・メンバ*/
    unsigned char   c;  /*1バイト・メンバ*/
};  /*共用体は4バイトで整列*/

(c)

構造体型に対する整列条件

構造体型に対する整列条件は,構造体を構成するメンバのうち,最大の整列条件をもつ型の整列条件と同じになります。

 

それぞれの場合における例を示します。

例 1.

struct  ST {
    char    c;      /*1バイト・メンバ*/
};  /*構造体は1バイトで整列*/

例 2.

struct  ST {
    char    c;      /*1バイト・メンバ*/
    short   s;      /*2バイト・メンバ*/
};  /*構造体は2バイトで整列*/

例 3.

struct  ST {
    char    c;      /*1バイト・メンバ*/
    short   s;      /*2バイト・メンバ*/
    short   s2;     /*2バイト・メンバ*/
};  /*構造体は2バイトで整列*/	

例 4.

struct  ST {
    char    c;      /*1バイト・メンバ*/
    short   s;      /*2バイト・メンバ*/
    int     i;      /*4バイト・メンバ*/
};  /*構造体は4バイトで整列*/	

例 5.

struct  ST {
    char        c;      /*1バイト・メンバ*/
    short       s;      /*2バイト・メンバ*/
    int         i;      /*4バイト・メンバ*/
    long long   ll;     /*4バイト・メンバ*/
};  /*構造体は4バイトで整列*/

(d)

関数引数に対する整列条件

関数引数に対する整列条件は,4バイト境界となります。

(e)

実行プログラムに対する整列条件

リロケータブルなオブジェクト・ファイルをリンクして実行可能なオブジェクト・ファイルを生成する際の整列条件は,2バイト境界となります。