ILE RPG での数値データタイプ

ILE RPG には伝統的な ゾーン 10進数パック 10進数の他に Integer(整数)Unsigned Integer(符号なし整数)などといった新しいデータタイプが増えています。

今回はそれぞれがどういうものかということと、その使い分けをかんたんにまとめてみました。


Integer(整数)とは?

Integer(整数)ですが、以下のように 3桁か 5桁か 10桁か 20桁の、使用できる値の範囲の決められた、小数点なしの数値を表すデータタイプになります。

フィールド長 記憶域のサイズ 使用できる値の範囲 定義
3桁 1バイト -128 〜 127 3i 0
5桁 2バイト -32768 〜 32767 5i 0
10桁 4バイト -2147483648 〜 2147483647 10i 0
20桁 8バイト -9223372036854775808 〜 9223372036854775807 20i 0

↑でもふれたように、RPG では"使用できる値"なんか考える必要はなく、小数点を含めた桁数だけを指定すればよかったのですが、いわゆる一般的なプログラミング言語ではもっとコンピュータに歩み寄る必要がありました。

コンピュータのメモリ上の"バイト"を中心に考えるわけです。

1バイトで表現可能な数値、2バイトで表現可能な数値、というようになっています。

C や Java での数値を扱うデータタイプ(型)と比較してみましょう。

フィールド長 記憶域のサイズ 使用できる値の範囲 C でのよくある実装 Java での定義
3桁 1バイト -128 〜 127 char byte
5桁 2バイト -32768 〜 32767 short short
10桁 4バイト -2147483648 〜 2147483647 int/long int
20桁 8バイト -9223372036854775808 〜 9223372036854775807 long long long

一致していることがわかりますね。

主に互換性や System API などの C と共通に使用される数値データのために、このデータタイプが導入されたことがうかがえます。

Unsigned Integer(符号なし整数)というデータタイプもあり、これはマイナスを表現しないという約束で、値の範囲を拡張したものになっています。

フィールド長 記憶域のサイズ 使用できる値の範囲 定義
3桁(符号なし) 1バイト 0 〜 255 3u 0
5桁(符号なし) 2バイト 0 〜 65535 5u 0
10桁(符号なし) 4バイト 0 〜 4294967295 10u 0
20桁(符号なし) 8バイト 0 〜 18446744073709551615 20u 0

考慮点

今までの伝統的な ゾーン 10進数パック 10進数との使い分けですが、たとえば「ILE RPG 解説書」の「フィールドの数値形式選択に関する考慮事項」には以下のように書いてあります。

>>

次の場合には、フィールドに整数または符号なし形式を使用しなければなりません。

  • 算術のパフォーマンスが重要な場合

    特定の算術演算では、使用される値が整数であることが重要な場合があります。 パフォーマンスが向上することがあるいくつかの例として、配列指標の計算および組み込み関数 %SUBST 用の引数があります。

  • ILE C のような、整数データ・タイプをサポートする他の言語で作成されたルーチンと対話をしている場合。
  • 整数として定義され、9999 または 999999999 を超える値が入れられることがあるファイル・フィードバック域のフィールドを使用している場合。

次の場合には、フィールドにパック、ゾーン、および 2 進形式を指定することが必要です。

  • 通貨の値のように、暗黙の小数点以下の桁数がある値を使用している場合
  • 19 桁以上の値を処理している場合
  • フィールドの特定の桁数を確認することが重要な場合

次の場合には、フィールドに浮動形式を指定することが必要です。

  • パックまたはゾーン値で表すことのできない非常に小さい値または非常に大きい値 (あるいはその両方) を保持するために同じ変数が必要な場合。

ただし、16 桁を超える精度を必要とする場合には、浮動形式を使用しないで ください。

注: 算術演算が整数または符号なし形式を使用して実行され、とくに、整数の演算が自由形式の式で行われた場合には、オーバーフローが起こる可能性がより高くなります。 これは、中間結果が十分なサイズの一時 10 進フィールドにではなく、整数または符号なし形式で保存されるからです。

>>

一般的に、↓のようなことが言えそうです。

【Integer(整数)について】

【パック、ゾーンの 10進数について】

(Bob Cozzi さんの本やサイトを参考にしてまとめました)

ちなみに、浮動小数点、なんてタイプもありますが、、まぁとりあえずそんなに使わなさそうではありますが。。

C の関数を呼び出すような場合、データ型の互換をとる必要がありますね。4バイトで定義すれば float、8バイトで定義すれば double、ということになります。

C での数値型 RPG での(だいたい同等の)定義 
int short 5i 0 (符号つき)整数 2バイト 
int long 10i 0 (符号つき)整数 4バイト
int long long 20i 0 (符号つき)整数 8バイト
unsigned int short 5u 0 符号なし整数 2バイト
unsigned int long 10u 0 符号なし整数 4バイト
unsigned int long long 20u 0 符号なし整数 8バイト
float 4f 浮動小数点 単精度
double 8f 浮動小数点 倍精度

[Top Pageに戻る]

Ads by TOK2