4.1.3 処理系依存

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

(1)

データ型とサイズ

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

-

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

-

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

表 4.1

データ型とサイズ

データ型

サイズ

char

1バイト

short

2バイト

int,long,float

4バイト

double,long double,long long

8バイト

ポインタ

unsigned intと同じ

(2)

翻訳段階

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

(3)

診断メッセージ

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

(4)

プログラム開始処理

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

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

(5)

プログラムの実行

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

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

(6)

文字集合

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

(7)

多バイト文字

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

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

(8)

文字表示の意味

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

表 4.2

拡張表記と意味

拡張表記

値(ASCII)

意味

\a

07

アラート(警告音)

\b

08

バックスペース

\f

0C

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

\n

0A

ニュー・ライン(改行)

\r

0D

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

\t

09

水平タブ

\v

0B

垂直タブ

(9)

翻訳限界

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

(10)

数量的限界

(a)

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

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

なお,多バイト文字はサポートしていないため,MB_LEN_MAXは該当する限界値を持ちません。そこで,MB_LEN_MAXには1として,定義のみ行っています。

次に,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

-128

char型の最小値

CHAR_MAX

+127

char型の最大値

SHRT_MIN

-32768

short int型の最小値

SHRT_MAX

+32767

short int型の最大値

USHRT_MAX

+65535

unsigned short int型の最大値

INT_MIN

-2147483648

int型の最小値

INT_MAX

+2147483647

int型の最大値

UINT_MAX

+4294967295

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ファイルで定義されている各種限界値を示します。

表 4.4

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

名前

意味

FLT_ROUNDS

+1または0

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

1 -Xround=nearest指定時

0 -Xround=zero指定時

FLT_RADIX

+2

指数表現の基数(b)

FLT_MANT_DIG

+24

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

DBL_MANT_DIG

+53

LDBL_MANT_DIG

+53

FLT_DIG

+6

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

DBL_DIG

+15

LDBL_DIG

+15

FLT_MIN_EXP

-125

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

(emin

DBL_MIN_EXP

-1021

LDBL_MIN_EXP

-1021

FLT_MIN_10_EXP

-37

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

log10bemin-1

DBL_MIN_10_EXP

-307

LDBL_MIN_10_EXP

-307

FLT_MAX_EXP

+128

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

(emax

DBL_MAX_EXP

+1024

LDBL_MAX_EXP

+1024

FLT_MAX_10_EXP

+38

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

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

DBL_MAX_10_EXP

+308

LDBL_MAX_10_EXP

+308

FLT_MAX

3.40282347E + 38F

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

(1 - b-p)*bemax

DBL_MAX

1.7976931348623158E+308

LDBL_MAX

1.7976931348623158E+308

FLT_EPSILON

1.19209290E - 07F

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

b1 - p

DBL_EPSILON

2.2204460492503131E-016

LDBL_EPSILON

2.2204460492503131E-016

FLT_MIN

1.17549435E - 38F

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

bemin - 1

DBL_MIN

2.2250738585072014E-308

LDBL_MIN

2.2250738585072014E-308

(11)

識別子

識別子すべてが意味のあるものとして扱います。また,識別子の長さは無制限です。

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

(12)

char型

char型より大きな量をchar型に格納した場合,char型に型変換した値となります。

型指定子(signed,unsigned)の付かない単なるchar型は,符号付き整数(signed char)として扱います。

char    c = '\777';     /*cの値は-1となる*/

(13)

浮動小数点定数

浮動小数点定数は,IEEE754に準拠しています。

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

(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-RHの-Xcharacter_setオプションで選択できます。

-Xcharacter_set=[none | euc_jp | sjis | utf8 | big5 | gb2312]

(16)

ヘッダ・ファイル名

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

(17)

コメント

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

(18)

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

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

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

(19)

浮動小数点と汎整数

汎整数型の値が浮動小数点型に型変換される際,型変換される値が,表現しうる値の範囲内にはあるが正確に表現することができない場合,その結果は,表現しうる最も近い値へ丸められます。

(20)

double型とfloat型

double型をfloat型に変換する場合,またはlong double型をdouble型,またはfloat型に変換するとき,型変換される値が,表現しうる値の範囲内にはあるが正確に表現することができない場合,その結果は,表現しうる最も近い値へ丸められます。

(21)

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

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

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

(22)

構造体と共用体のメンバ

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

(23)

sizeof演算子

“sizeof”演算子の結果は,「(1) データ型とサイズ」におけるオブジェクト中のバイトに関する規定に準じます。

なお,構造体と共用体については,パディング領域を含んだバイト数とします。

(24)

キャスト演算子

ポインタを汎整数型に変換する場合,要求される変数のサイズは,unsigned long型と同じサイズです。変換結果は,ビット列がそのまま保存されます。

また,任意の整数はポインタに型変換できますが,整数をポインタに型変換した場合,整数のビットパターンがそのまま保持されます。

(25)

乗除/剰余演算子

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

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

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

(26)

加減演算子

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

(27)

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

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

(28)

記憶域クラス指定子

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

(29)

構造体と共用体指定子

(a)

signed,unsignedの付かない単なるint型ビット・フィールドは,符号付きとして扱い,最上位ビットは符号ビットとして扱います。

(b)

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

(c)

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

char,unsignd char型,およびその配列

バイト境界

short,unsigned short型,およびその配列

2バイト境界

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

4バイト境界

ただし,パッキングをした場合は,すべてのメンバの境界はパッキングの指定値に依存します。

(30)

列挙型指定子

列挙型の型は,signed int型とします。

ただし,-Xenum_type=autoオプション指定時は,各列挙型について,その型のすべての列挙子の値を表現可能な最小の整数型として扱います。

(31)

型修飾子

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

(32)

条件組み込み

(a)

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

(b)

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

(33)

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

(a)

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

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

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

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

 

#include    <header.h>

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

-

-Iで指定したフォルダ

-

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

(b)

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

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

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

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

 

#include    "header.h"

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

-

ソース・ファイルがあるフォルダ

-

-Iで指定したフォルダ

-

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

(c)

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

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

(d)

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

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

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

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

(34)

#pragma指令

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

(a)

データ/プログラムのメモリ割り当て

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

変数を任意のセクションに割り当てます。

なお,配置方法についての詳細は「4.2.4.1 データとプログラムのセクション割り当て」を参照してください。

(b)

アセンブラ命令の記述

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

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

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

(c)

インライン展開指定

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

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

なお,インライン展開についての詳細は「4.2.4.3 インライン展開」を参照してください。

(d)

割り込み/例外ハンドラ指定

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

割り込み/例外処理ハンドラをC言語で記述します。

なお,記述方法についての詳細は「(3) 割り込み/例外ハンドラの記述方法」を参照してください。

(e)

割り込み禁止関数指定

#pragma block_interrupt [(]関数名[)]

関数全体を割り込み禁止にします。

なお,記述方法についての詳細は「(2) 関数全体の割り込みを禁止する方法」を参照してください。

(f)

構造体パッキング指定

#pragma pack [(][1|2|4][)]

構造体パッキングを指定します。数値はパッキング値,すなわちメンバのアライメント値を指定します。数値には1,2,4が指定できます。数値を指定しない場合,デフォルトのアライメントとなります。

なお,記述方法についての詳細は「4.2.4.8 構造体パッキング」を参照してください。

(g)

ビット・フィールドの割り付け

#pragma bit_order [{left|right}]

ビット・フィールドの並び順の切り替えを指定します。

なお,記述方法については「4.2.4.9 ビット・フィールドの割り付け」を参照してください。

(h)

コア番号指定(マルチコア用)

#pragma pmodule pm指定

コア番号指定を行う関数を指定することができます。

なお,コア番号指定についての詳細は「4.2.4.10 コア番号指定(マルチコア用)」を参照してください。

(i)

分岐先アドレスのアライメント指定

#pragma align4 [(]関数名[(仕様)][)]

分岐先アドレスのアライメントを指定することができます。

なお,分岐先アドレスのアライメント指定についての詳細は「4.2.4.11 分岐先アドレスのアライメント指定」を参照してください。

(j)

スタック破壊検出コードを生成する関数の指定 【Professional 版のみ】

#pragma stack_protector [(]関数名[(num=<整数値>)][)]
#pragma no_stack_protector [(]関数名[)]

スタック破壊検出コードを生成する関数を指定することができます。

なお,記述方法の詳細については「4.2.4.12 スタック破壊検出機能 【Professional 版のみ】」を参照してください。

(35)

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

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

表 4.5

サポートしているマクロ

マクロ名

定義

__LINE__

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

__FILE__

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

__DATE__

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

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

__TIME__

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

__STDC__

10進定数1(-Xansiオプション指定時に定義)。

__RENESAS__

値は設定されません。

__RENESAS_VERSION__

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

例)V.1.00.00 → -D__RENESAS_VERSION__=0x01000000

__CCRH__

値は設定されません。

__CCRH

値は設定されません。

__RH850__

値は設定されません。

__RH850

値は設定されません。

__v850e3v5__

値は設定されません(-Xcommon オプションで,v850e3v5,またはrh850を指定した場合に定義)。

__v850e3v5

値は設定されません(-Xcommon オプションで,v850e3v5,またはrh850を指定した場合に定義)。

__DBL4

-Xdbl_size=4指定時のみ

値は設定されません。

__DBL8

-Xdbl_size=8 指定時または-Xdbl_size 指定がない場合

値は設定されません。

__DOUBLE_IS_64BITS__

-Xdbl_size=8 指定時または-Xdbl_size 指定がない場合

値は設定されません。

__DOUBLE_IS_32BITS__

-Xdbl_size=4 指定時のみ

値は設定されません。

__RON

-Xround=nearest指定時のみ

値は設定されません

__ROZ

-Xround=zero指定時のみ

値は設定されません

__BITLEFT

値は設定されません(-Xbit_orderオプションで,leftを指定した場合に定義)。

__BITRIGHT

値は設定されません(-Xbit_orderオプションで,rightを指定した場合に定義)。

__AUTO_ENUM

値は設定されません(-Xenum_typeオプションで,autoを指定した場合に定義)。

__FPU

値は設定されません(-Xfloatオプションで,fpuを指定した場合に定義)。

__CHAR_SIGNED__

値は設定されません。

レジスタ・モード・マクロ

レジスタ・モードと定義されるマクロは次のとおりです。

32レジスタ・モード : __reg32__

22レジスタ・モード : __reg22__

汎用レジスタ・モード : __reg_common__

_LIT

値は設定されません。

__MULTI_LEVEL__

-Xmulti_level=levelで指定したlevel値

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