4.1.3 処理系依存

この項では,ANSI規格における処理系依存項目について説明します。

(1)

データ型とサイズ

ワード(2バイト)中のバイト順序は,“下位から上位”です。また,符号付き整数は,2の補数で表現します。最上位ビットには,符号(正,または0の場合0,負の場合1)が入ります。

-

1バイト中のビット数は,8ビットとします。

-

オブジェクト中のバイト数,バイト順序,符号化は,次のように規定します。

表 4.1

データ型とサイズ

データ型

サイズ

char

1バイト

short,int

2バイト

long,float

4バイト

double,long double

8バイト

long long

8バイト

nearポインタ

2バイト

farポインタ

4バイト

-dbl_size=4指定時は4バイトとなります。CC-RLは,-dbl_size = 4 をデフォルト動作とします。

(2)

翻訳段階

ANSI規格では,翻訳における構文規則間の優先順位を8つの翻訳段階(翻訳フェーズ)に規定しています。3段階目の“前処理字句と空白類文字の並びへの分割”で処理系定義となっている,“改行文字以外の空白類文字の空でない並び”は1つに置き換えられずそのまま保持されます。

(3)

診断メッセージ

何らかの構文規則違反,および制約違反を含む翻訳単位に対して,ソース・ファイル名,行番号(特定可能な場合のみ)を含むエラー・メッセージを出力します。なお,エラー・メッセージの書式は“ワーニング”,“アボート・エラー”,“フェイタル・エラー”などに区別されます。出力形式については,「10.2 出力形式」を参照してください。

(4)

プログラム開始処理

プログラム開始処理時に呼び出される関数の名前,および型は特に規定しません。

したがって,ユーザ・オウン・コーディング,またはターゲット・システムに依存します。

(5)

プログラムの実行

対話型装置の構成については,特に規定しません。

したがって,ユーザ・オウン・コーディング,またはターゲット・システムに依存します。

(6)

文字集合

実行環境文字集合の要素の値は,ASCIIコードです。

(7)

多バイト文字

利用できる多バイト文字は,EUC,SJIS,UTF-8,big5,gbkです。

コメントと文字列における日本語/中国語記述をサポートしています。

(8)

文字表示の意味

拡張表記の値は,次のように規定します。

表 4.2

拡張表記と意味

拡張表記

値(ASCII)

意味

\a

07

アラート(警告音)

\b

08

バックスペース

\f

0C

フォーム・フィード(改ページ)

\n

0A

ニュー・ライン(改行)

\r

0D

キャリッジ・リターン(復帰)

\t

09

水平タブ

\v

0B

垂直タブ

(9)

翻訳限界

翻訳に際しての限界値はありません。翻訳可能な最大値は動作するホスト・マシンのメモリに依存します。

備考 1.

1つの宣言中の1つの算術型,構造体型,共用体型,または不完全型を修飾するポインタ,配列および関数宣言子(の任意の組み合わせ)の個数は128となります。

備考 2.

1つのオブジェクトのバイト数の最大値は32767となります。ただし,オプション-large_variable使用時は,65535となります。

(10)

数量的限界

(a)

汎整数型の限界値(limits.hファイル)

汎整数型(char型,符号付き/符号なし整数型,および列挙型)で表現できる値の各種限界値をlimits.hファイルに定義しています。

次に,limits.hファイルで定義されている各種限界値を示します。

表 4.3

汎整数型の各種限界値(limits.hファイル)

名前

意味

CHAR_BIT

+8

ビット・フィールドではない最小のオブジェクトのビット数(= 1バイト)

SCHAR_MIN

-128

signed char型の最小値

SCHAR_MAX

+127

signed char型の最大値

UCHAR_MAX

+255

unsigned char型の最大値

CHAR_MIN

0(-128)

char型の最小値(デフォルトはunsigned。オプション-signed_char でsigned になります。)

CHAR_MAX

+255(+127)

char型の最大値(デフォルトはunsigned。オプション-signed_char でsigned になります。)

SHRT_MIN

-32768

short int型の最小値

SHRT_MAX

+32767

short int型の最大値

USHRT_MAX

+65535

unsigned short int型の最大値

INT_MIN

-32768

int型の最小値

INT_MAX

+32767

int型の最大値

UINT_MAX

+65535

unsigned int型の最大値

LONG_MIN

-2147483648

long int型の最小値

LONG_MAX

+2147483647

long int型の最大値

ULONG_MAX

+4294967295

unsigned long int型の最大値

LLONG_MIN

-9223372036854775808

long long int型の最小値

LLONG_MAX

+9223372036854775807

long long int型の最大値

ULLONG_MAX

+18446744073709551615

unsigned long long int型の最大値

(b)

浮動小数点型の各種限界値(float.hファイル)

浮動小数点型の特性に関する各種限界値をfloat.hファイルに定義しています。

次に,float.hファイルで定義されている各種限界値を示します。

()内は,sizeof(double) = sizeof(long double) = 4 にするオプション(-dbl_size = 4)指定時の値です。CC-RLは,-dbl_size = 4をデフォルト動作とします。

表 4.4

浮動小数点型の各種限界値の定義(float.hファイル)

名前

意味

FLT_ROUNDS

+1

浮動小数点加算に対する丸めのモード

1(もっとも近傍へ丸める)とします。

FLT_RADIX

+2

指数表現の基数(b)

FLT_MANT_DIG

+24

浮動小数点仮数部におけるFLT_RADIXを底とする数字の桁数(p)

DBL_MANT_DIG

+53(+24)

LDBL_MANT_DIG

+53(+24)

FLT_DIG

+6

q桁の10進数の浮動小数点数を基数bのp桁をもつ浮動小数点数に丸めることができ,再び変更なしにq桁の10進数値に戻すことが可能な10進数の桁数(q)

DBL_DIG

+15(+6)

LDBL_DIG

+15(+6)

FLT_MIN_EXP

-125

FLT_RADIXをその値から1引いた値でべき乗したとき,正規化された浮動小数点数となるような最小の負の整数

(emin

DBL_MIN_EXP

-1021(-125)

LDBL_MIN_EXP

-1021(-125)

FLT_MIN_10_EXP

-37

10をその値でべき乗したとき,正規化された浮動小数点数の範囲内になるような最小の負の整数

log10bemin-1

DBL_MIN_10_EXP

-307(-37)

LDBL_MIN_10_EXP

-307(-37)

FLT_MAX_EXP

+128

FLT_RADIXをその値から1引いた値でべき乗したとき,表現可能な有限浮動小数点数となるような最大の整数

(emax

DBL_MAX_EXP

+1024(+128)

LDBL_MAX_EXP

+1024(+128)

FLT_MAX_10_EXP

+38

10をその値でべき乗したとき,表現可能な有限浮動小数点数の範囲内になるような最大の整数

log10 ((1 - b-p) * bemax)

DBL_MAX_10_EXP

+308(+38)

LDBL_MAX_10_EXP

+308(+38)

FLT_MAX

3.40282347E + 38F

表現可能な有限浮動小数点数の最大値

(1 - b-p)*bemax

DBL_MAX

1.7976931348623158E+308(3.40282347E+38F)

LDBL_MAX

1.7976931348623158E+308(3.40282347E+38F)

FLT_EPSILON

1.19209290E - 07F

指定された浮動小数点型で表現できる1.0と,1.0より大きい最も小さい値との差異

b1 - p

DBL_EPSILON

2.2204460492503131E-016(1.19209290E - 07F)

LDBL_EPSILON

2.2204460492503131E-016(1.19209290E - 07F)

FLT_MIN

1.17549435E - 38F

正規化された正の浮動小数点数の最小値

bemin - 1

DBL_MIN

2.2250738585072014E-308(1.17549435E - 38F)

LDBL_MIN

2.2250738585072014E-308(1.17549435E - 38F)

(11)

識別子

識別子すべてが意味のあるものとして扱います。

なお,英字の大文字と小文字は区別されます。

(12)

char型

ソース文字集合の要素ではない量をchar型に格納した場合,char型に型変換した値となります。

また,オプション-signed_char 不使用時は,単なるchar型をunsigned char型として扱います。オプション-signed_char 使用時は,単なるchar型をsigned char型として扱います。

char    ch = '\777';     /*chの値は+255となる*/

(13)

浮動小数点定数

無限の有効桁を持つとして計算した場合の結果と近い方の値へ丸めます。中間時は結果が偶数になる方向へ丸めます。

(14)

文字定数

(a)

ソース・プログラムの文字集合と実行環境における文字集合は,基本的に両者ともASCIIコードで,同一の値をもつメンバと対応します。
ただし,ソース・プログラムにおける文字列には,日本語文字コードが使用できます(「(8) 文字表示の意味」を参照)。

(b)

2つ以上の文字を含む整数文字定数の値は,最後の1文字が有効値となります。

(c)

基本的な実行環境文字集合で表現されない文字やエスケープ・シーケンスを含む場合,次のようになります。

<1>

8進数エスケープ・シーケンス,および16進数エスケープ・シーケンスは,その8進数表記,および16進数表記で示される値となります。

\777

511

<2>

単純エスケープ・シーケンスは,次のようになります。

\'

'

\"

"

\?

?

\\

\

<3>

\a,\b,\f,\n,\r,\t,\vについては,「(8) 文字表示の意味」で示されている値と同値になります。

(d)

多バイト文字の文字定数はサポートしていません。

(15)

文字列

文字列中に日本語/中国語が記述できます。

デフォルトの文字コードは,シフトJISとなります。

入力ソース・ファイルの中の文字コードは,CC-RLのオプション-character_setで選択できます。

-character_set=[none | euc_jp | sjis | utf8 | big5 | gbk]

(16)

ヘッダ・ファイル名

ヘッダ・ファイル名の2つの形式(< >," ")内の列を,ヘッダ・ファイル,または外部ソース・ファイル名に反映する方法は,「(34) ヘッダ・ファイル取り込み」で規定します。

(17)

コメント

コメント中に日本語/中国語が記述できます。文字コードは,「(15) 文字列」の場合と同じです。

(18)

文字型と整数型

signed,unsignedの付かない単なるchar 型を符号なしとして扱います。オプション-signed_char使用時は,符号付きとして扱います。

(19)

符号付き定数と符号なし定数

汎整数型の値がよりサイズの小さい符号付き整数に変換される場合,上位ビットを切り捨てて,ビット列イメージをコピーします。

また,符号なし整数が,対応する符号付き整数に変換される場合,内部表現は変化しません。

(20)

浮動小数点と汎整数

汎整数型の値が浮動小数点型に型変換される際,型変換される値が,表現しうる値の範囲内にはあるが正確に表現することができない場合,その結果は,無限の有効桁を持つとして計算した場合の結果と近い方の値へ丸められます。中間時は結果が偶数になる方向へ丸られます。

(21)

double型とfloat型

double型をfloat型に変換する場合,またはlong double型をdouble型,またはfloat型に変換するとき,型変換される値が,表現しうる値の範囲内にはあるが正確に表現することができない場合,その結果は,無限の有効桁を持つとして計算した場合の結果と近い方の値へ丸められます。中間時は結果が偶数になる方向へ丸られます。

(22)

ビット単位の演算子における符号付き型

ビット単位の演算子における符号付き型に対する特性は,シフト演算子については,「(28) ビット単位のシフト演算子」の規定に準じます。

また,その他の演算子については,符号なしの値として(ビット・イメージのままで)計算するものとします。

(23)

構造体と共用体のメンバ

共用体のメンバの値がそれと異なるメンバに格納される場合,整列条件にしたがって格納されるため,その共用体のあるメンバへのアクセスは,後からアクセスした型としてアクセスされます。

(24)

sizeof演算子

“sizeof”演算子の結果は,unsigned int型とします。

(25)

キャスト演算子

ポインタを汎整数型に変換する場合,要求される変数のサイズは,下記のサイズとなります。

-

near : 2 バイト

-

far : 4 バイト

変換結果は,ビット列がそのまま保存されます。ただしfarポインタの不定値である最上位1 バイトは,ゼロに変換されます。

また,任意の整数はポインタに型変換できますが,ポインタ型のサイズが整数型のサイズよりも小さい場合は,ポインタ型のサイズに切り詰めます。ポインタ型のサイズが整数型のサイズより大きい場合は,整数型をポインタ型のサイズまで通常の型変換した後に,ポインタ型に型変換します。

変換には,nearポインタとfarポインタが関与するため,「メモリ配置領域指定(__near/__far)」中の「キャスト」を参照してください。

(26)

乗除/剰余演算子

整数同士の除算で割り切れず,オペランドが負の値をもつ場合,“/”演算子の結果は,除数,または被除数のいずれか一方が負の場合は,代数的な商よりも大きい最小の整数となります。

ただし,どちらも負の場合は,代数的な商よりも小さい最大の整数となります。

また,オペランドが負の値をもつ場合,“%”演算子の結果の符号は第1オペランドの符号とします。

(27)

加減演算子

同一配列の要素を指す2つのポインタが減算される場合,結果の型はsigned int型となります。

(28)

ビット単位のシフト演算子

“E1 >> E2”において,E1が符号付きの型で負の値をもつ場合,算術シフトを行います。

(29)

記憶域クラス指定子

記憶域クラス指定子“register”の宣言の有無にかかわらず,可能なかぎり高速にアクセスするように最適化を行います。

(30)

構造体と共用体指定子

(a)

signed,unsignedの付かない単なるint型ビット・フィールドは,unsigned int 型となります。ただし,オプション-signed_bitfield 使用時は,signed int 型となります。

(b)

ビット・フィールドを保持するために,十分な大きさの任意のアドレス付け可能な記憶域単位を割り付けることができますが,十分な領域がなかった場合,合わなかったビット・フィールドはフィールドの型の整列条件に合わせて次の単位に詰め込まれます。
単位内のビット・フィールドの割り付け順序は下位から上位です。

(c)

1つの構造体,または共用体の非ビット・フィールドの各メンバは,次のように境界整列されます。

_Bool,char,signed char,unsigned char 型

1 バイトサイズの列挙型,およびその配列

1バイト境界

構造体,共用体を除く上記以外の型,および2 バイトサイズの列挙型

2バイト境界

メンバが構造体,または共用体オブジェクトの場合は,メンバの構造体定義,または共用体定義の境界に従います。

(31)

列挙型指定子

列挙型の型は,定義する列挙定数の範囲によりchar,signed char,unsigned char,signed short型の4種類のいずれかとなります。詳細は「(4) 列挙型」を参照してください。

(32)

型修飾子

“volatile”修飾された型をもつデータへのアクセスは,データがマッピングされているアドレス(I/Oポートなど)に依存します。ただし,同変数へのアクセス箇所への最適化は行わず,必ずアクセスします。

以下のように,特定の条件に該当する同変数へのアクセス・サイズは保証されます。

-

変数がビットフィールドではなく,かつ変数が以下の型で宣言されている場合,当該型の幅と同じ幅でアクセスします。

-

(signed/unsigned)int

-

(signed/unsigned)short

-

near 変数ポインタ

-

near 関数ポインタ

-

(signed/unsigned)char

-

_Bool

-

列挙型

(33)

条件組み込み

(a)

条件組み込みで指定される文字定数に対する値と,その他の式中に現れる文字定数の値とは等しくなります。

(b)

単一文字の文字定数は,負の値を持ちません。

(34)

ヘッダ・ファイル取り込み

(a)

“#include <文字列>”という形式の前処理指示

“#include <文字列>”という形式の前処理指示は,“文字列”がフルパスのファイル名でない場合,指定されたフォルダ(-Iオプション)からヘッダ・ファイルを検索し,次に標準インクルード・ファイル・フォルダ(ccrlが置かれたbinフォルダからの相対パスでの..\incフォルダ)を検索します。

なお,“<”と“>”の区切り記号の間に指定された文字列で一意に識別されるヘッダ・ファイルを探し出すと,そのヘッダ・ファイルの内容全体で置き換えます。

“\”と“/”の両者がフォルダの区切りとしてみなされます。

 

#include    <header.h>

 

検索順は,次のとおりです。

-

-Iで指定したフォルダ

-

標準インクルード・ファイル・フォルダ

(b)

“#include "文字列"”という形式の前処理指示

“#include "文字列"”という形式の前処理指示は,“文字列”がフルパスのファイル名でない場合,ソース・ファイルがあるフォルダからヘッダ・ファイルを検索し,次に,指定したフォルダ(-Iオプション),最後に標準インクルード・ファイル・フォルダ(ccrlが置かれたbinフォルダからの相対パスでの..\incフォルダ)を検索します。

なお,“ " ”“ " ”の区切り記号の間に指定された文字列で一意に識別されるヘッダ・ファイルを探し出すと,そのヘッダ・ファイルの内容全体で置き換えます。

“\”と“/”の両者がフォルダの区切りとしてみなされます。

 

#include    "header.h"

 

検索順は,次のとおりです。

-

現在翻訳対象としているファイル(#include "文字列"を含むファイル)が存在するフォルダ

-

-Iで指定したフォルダ

-

標準インクルード・ファイル・フォルダ

(c)

“#include 前処理字句列”という形式

“#include前処理字句列”という形式において,前処理字句列が単一で<文字列>,または"文字列"の形式に置換されるマクロである場合にのみ,単一のヘッダ・ファイル名の前処理字句として扱われます。

(d)

“#include <文字列>”という形式の前処理指示

(最終的に)区切られた列とヘッダ・ファイル名との間においては,列中の英文字の長さを判別し,

“コンパイラ動作環境において有効なファイル名長までが有効”

となります。ファイルを探すフォルダについては,上記の規定に準じます。

(35)

#pragma指令

CC-RLでは,次の#pragma指令が指定できます。

(a)

割り込みハンドラ指定

#pragma interrupt   [(]関数名[(割り込み仕様 [,...])][)]
#pragma interrupt_brk   [(]関数名[(割り込み仕様 [,...])][)]

 

割り込みハンドラをC言語で記述します。

なお,記述方法についての詳細は「ハードウェア割り込みハンドラ(#pragma interrupt)」および「ソフトウェア割り込みハンドラ(#pragma interrupt_brk)」を参照してください。

(b)

セクション割り当て

#pragma section [ セクション種別][ 変更セクション名]

 

コンパイラが出力するセクション名を切り替えます。

なお,記述方法についての詳細は「コンパイラ出力セクション名の変更(#pragma section)」を参照してください。

(c)

インライン展開指定

#pragma inline      [(]関数名 [,...][)]
#pragma noinline    [(]関数名 [,...][)]

 

インライン展開する関数を指定することができます。

なお,インライン展開についての詳細は「関数のインライン展開(#pragma inline/#pragma noinline)」を参照してください。

(d)

RTOS用割り込みハンドラ指定

#pragma rtos_interrupt   [(]関数名[(vect=アドレス)][)]

 

RTOS用の割り込みハンドラをC言語で記述します。

なお,記述方法についての詳細は「RTOS用割り込みハンドラ(#pragma rtos_interrupt)」を参照してください。

(e)

RTOS用タスク

#pragma rtos_task   [(]タスク関数名 [ ,...][)]

 

RTOS用タスクをC言語で記述します。

なお,記述方法についての詳細は「RTOS用タスク関数(#pragma rtos_task)」を参照してください。

(f)

絶対番地指定

#pragma address [(]変数名=絶対アドレス[,...][)]

 

絶対番地を指定します。

なお,記述方法については「絶対番地配置指定(#pragma address)」を参照してください。

(g)

アセンブラ命令の記述

#pragma inline_asm  [(]関数名 [,...][)]

 

C言語中に,アセンブラ命令を記述することができます。

なお,記述方法についての詳細は「アセンブラ命令の記述(#pragma inline_asm)」を参照してください。

(36)

あらかじめ定義されたマクロ名

以下に,サポートしているマクロ名を示します。

表 4.5

サポートしているマクロ

マクロ名

定義

__LINE__

その時点でのソース行の行番号(10進数)。

__FILE__

ソース・ファイルの名前(文字列定数)。

__DATE__

ソース・ファイルの翻訳日付(“Mmm dd yyyy”の形式をもつ文字列定数。

ここで,月の名前はANSI規格で規定されているasctime関数で生成されるもの(英字3文字の並びで最初の1文字のみ大文字)と同じもの。ddの最初の文字は値が10より小さい場合空白とします)。

__TIME__

ソース・ファイルの翻訳時間(asctime関数で生成される時間と同じような“hh : mm : ss”の型式をもつ文字列定数)。

__STDC__

10進定数1(-ansiオプションを指定した場合に定義)。

__RENESAS__

10進定数1。

__RENESAS_VERSION__

バージョンがV.XX.YY.ZZの場合,0xXXYYZZ00とします。

例)V.1.00.00 → -D__RENESAS_VERSION__=0x01000000

__RL78__

10進定数1。

__RL78_S1__

10進定数1(-cpuオプションでS1を指定した場合に定義)。

__RL78_S2__

10進定数1(-cpuオプションでS2を指定した場合に定義)。

__RL78_S3__

10進定数1(-cpuオプションでS3を指定した場合に定義)。

__RL78_SMALL__

10進定数1(-memory_modelオプションでsmallを指定した場合,あるいは,-memory_modelオプションを指定せず,-cpuオプションでS1を指定した場合に定義)。

__RL78_MEDIUM__

10進定数1(-memory_modelオプションでmediumを指定した場合,あるいは,-memory_modelオプションを指定せず,-cpuオプションでS2,またはS3を指定した場合に定義)。

__CCRL__

10進定数1。

__CCRL

10進定数1。

__DBL4

10進定数1(-dbl_sizeオプションで4を指定した場合に定義)。

__DBL8

10進定数1(-dbl_sizeオプションで8を指定した場合に定義)。

__SCHAR

10進定数1(-signed_charオプションを指定した場合に定義)。

__UCHAR

10進定数1(-signed_charオプションを指定しなかった場合に定義)。

__SBIT

10進定数1(-signed_bitfieldオプションを指定した場合に定義)。

__UBIT

10進定数1(-signed_bitfieldオプションを指定しなかった場合に定義)。

__FAR_ROM__

10進定数1(-far_romオプションを指定した場合に定義)。

__CNV_CA78K0R__

10進定数1(-convert_ccオプションでca78k0rを指定した場合に定義)。

__CNV_NC30__

10進定数1(-convert_ccオプションでnc30を指定した場合に定義)。

__CNV_IAR__

10進定数1(-convert_ccオプションでiarを指定した場合に定義)。

__BASE_FILE__

Cソース・ファイルの名前(文字列定数)。

__FILE__と異なり,インクルード・ファイル内で使用してもCソース・ファイル名を返します。

__STDC_VERSION__

10進定数199409L(-ansiオプションを指定した場合に定義)。

-ansiオプション指定時の処理については,「4.1.5 ANSI規格に厳密な処理オプション」を参照してください。