メインコンテンツまでスキップ
バージョン: 開発中

数値(実数、整数)

数値とは、以下を示す総称です:

  • 実数のフィールド、変数、または式。 実数データタイプの範囲は、±1.7e±308 (有効数字13桁) です。
  • 整数の変数または式。 整数データタイプの範囲は -2^31..(2^31)-1 です(4-バイト整数、別名Long または Longint)。
互換性

通常、整数を使用する場合には、Long を扱います(4-バイト整数)。 しかしながら、整数がShots 値(2-バイト整数)として保存される場合が二つあります。その際、範囲は-32,768..32,767 (2^15..(2^15)-1) となります:

  • Integer 型のデータベースフィールド
  • ARRAY INTEGER として宣言した配列の要素

旧式のデータタイプは、4D ランゲージで使用される際に自動的にLong へと変換されます。

数値データタイプは、異なる数値データタイプに代入することができます。このとき、4Dが必要に応じて変換、切り捨て、丸め処理をおこないます。 ただし、値が範囲外の場合には、変換は正しい値を返しません。 数値データタイプは式の中において混在させて使用することができます。

数値リテラル

数値リテラル定数は、実数として記述します。 下記に数値定数の例をいくつか示します:

27
123.76
0.0076

デフォルトの小数点はシステム言語に関係なくピリオド (.) です。 環境設定の"地域特有のシステム設定を使う" オプションにチェックがされている場合、自分のシステムで定義されている小数点を使用する必要があります。

負の数値は、マイナス記号 (-) を付けて指定します。 例:

-27
-123.76
-0.0076

数値演算子

演算シンタックス戻り値
加算 (足し算)Number + NumberNumber2 + 35
減算 (引き算)Number - NumberNumber3 – 21
乗算 (かけ算)Number * NumberNumber5 * 210
除算 (割り算)Number / NumberNumber5 / 22.5
倍長整数を返す除算Number \ NumberNumber5 \ 22
モジューロNumber % NumberNumber5 % 21
指数Number ^ NumberNumber2 ^ 38
等しいNumber = NumberBoolean10 = 10true
10 = 11false
異なるNumber # NumberBoolean10 # 11true
10 # 10false
大きいNumber > NumberBoolean11 > 10true
10 > 11false
小さいNumber < NumberBoolean10 < 11true
11 < 10false
以上Number >= NumberBoolean11 >= 10true
10 >= 11false
以下Number <= NumberBoolean10 <= 11true
11 <= 10false

モジューロ

モジューロ演算子 % は最初の数値を 2番目の数値で除算し、その余りの整数を返します。 次に例を示します:

  • 10 % 2は、0を返します。10 は 2 で割り切れるからです。
  • 10 % 3は、1を返します。余りが 1 だからです。
  • 10.5 % 2は、0を返します。余りが整数ではない (0.25) からです。
警告

モジューロ演算子 % は倍長整数の範囲内 (-2^31 から (2^31)-1 まで) の数値に対して有効な値を返します。 範囲外の数値に対してモジューロを計算したい場合には、Mod コマンドを使用してください。

倍長整数を返す除算

倍長整数を返す除算演算子 \ は、整数値の有効値を返します。

実数の比較

2つの実数が等しいかどうかを比較するために、4Dランゲージは実際には差の絶対値を イプシロン値 と比較します。 詳細関してはSET REAL COMPARISON LEVEL コマンドを参照してください。

一貫性のため、4Dデータベースエンジンは実数型のデータベースフィールドを比較する際には常に イプシロン値 として 10^-6 の値を使用し、SET REAL COMPARISON LEVEL の設定を考慮しません。

優先順位

式を評価する順番を優先順位と呼びます。 4D における優先順位は厳密に左から右で、代数的順序は採用されていません。 例:

 3+4*5

これは 35 を返します。最初に式 3+4 の結果 7 を求め、それに 5 を乗じるので、結果は 35 になります。

左から右の優先順位を変更するには、必ずカッコを使用します。 例:

 3+(4*5)

この式は、23 を返します。カッコがあるため、最初に式 (4*5) の結果 20 を求め、 それに 3 を加えて、結果は 23 になります。

カッコは、他のカッコの組の内側にネストすることができます。 式の評価が正しくおこなわれるように、必ず各左カッコに対応する右カッコを指定してください。 カッコの不足または誤用は、予測できない結果や、式の無効化につながります。 またコンパイルする場合は、左カッコと右カッコは同じ数でなければなりません。組になっていないカッコはシンタックスエラーとして検出されます。

ビットワイズ演算子

ビットワイズ演算子は、(倍長)整数の式や値に対して演算をおこないます。

ビットワイズ演算子に(ショート)整数値または実数値を渡すと、4Dは値を倍長整数値として評価してから、ビットワイズ演算子を使用した式を計算します。

ビットワイズ演算子を使用する場合、倍長整数値を32ビットの配列と考える必要があります。 これらのビットには、右から左に0~31の番号が付けられます。

それぞれのビットは0か1なので、倍長整数値は32のブール値を格納できる値と考えることもできます。 1に等しいビットはTrue 、0に等しいビットはFalse を意味します。

ビットワイズ演算子を使用する式は倍長整数値を返します。 Bit Test 演算子の場合、式は例外的にブール値を返します。 次の表にビットワイズ演算子とそのシンタックスを示します:

演算演算子シンタックス戻り値
Bitwise AND&Long & LongLong
Bitwise OR (inclusive)&#124Long | LongLong
Bitwise OR (exclusive)^ &#124Long ^ | LongLong
Left Bit Shift<<Long << LongLong (注記1 参照)
Right Bit Shift> >Long >> LongLong (注記1 参照)
Bit Set?+Long ?+ LongLong (注記2 参照)
Bit Clear?-Long ?- LongLong (注記2 参照)
Bit Test??Long ?? LongBoolean (注記2 参照)

注記

  1. Left Bit Shift およびRight Bit Shift 演算では、2番目のオペランドは、結果値において1番目のオペランドのビットがシフトされるビット数を示します。 したがって、この2番目のオペランドは、0~31の間でなければなりません。 0ビットシフトするとその値がそのまま返されます。また、31ビットより多くシフトするとすべてのビットがなくなるので、0x00000000が返されます。 それ以外の値を2番目のオペランドとして渡した場合、結果は意味のない値になります。
  2. Bit SetBit ClearBit Test 演算では、2番目のオペランドは、作用の対象となるビット番号を示します。 したがって、この2番目のオペランドは0 ~ 31の間です。そうでない場合、式の結果は意味のないものになります。

次の表は、ビットワイズ演算子とその効果を示します:

演算説明
Bitwise ANDそれぞれの結果ビットは2つのオペランドのビットの論理ANDです。 論理AND の表は以下のようになります:
  • 1 & 1 --> 1
  • 0 & 1 --> 0
  • 1 & 0 --> 0
  • 0 & 0 --> 0
  • 言い換えると、結果のビットは両方のオペランドが1であれば1となり、それ以外の場合には結果のビットは0 となります。
    Bitwise OR (inclusive)それぞれの結果ビットは2つのオペランドのビットの論理OR です。論理OR の表は以下のようになります。:
  • 1 | 1 --> 1
  • 0 | 1 --> 1
  • 1 | 0 --> 1
  • 0 | 0 --> 0
  • 言い換えると、結果のビットは、少なくともどちらかのオペランドが1であれば1となり、それ以外の場合には結果のビットは0 となります。
    Bitwise OR (exclusive)それぞれの結果ビットは2つのオペランドの論理XOR です。論理XOR の表は以下のようになります:
  • 1 ^ | 1 --> 0
  • 0 ^ | 1 --> 1
  • 1 ^ | 0 --> 1
  • 0 ^ | 0 --> 0
  • 言い換えると、結果のビットは2つのオペランドのどちらか1つが1の場合にのみ1となり、それ以外の場合には結果のビットは0 となります。
    Left Bit Shift最初のオペランド値が結果値に設定され、次に結果ビットが2番目のオペランドで示されたビット数だけ左にシフトします。 左側のビットがなくなり、右側の新しいビットは0に設定されます。 注記: 正の数だけを考えると、Nビット左にシフトすることは、2^N を掛けることと同じです。
    Right Bit Shift最初のオペランド値が結果値に設定され、次に結果ビットが2番目のオペランドで示されたビット数だけ右にシフトします。 右側のビットがなくなり、左側の新しいビットは 0 に設定されます。 注記: 正の数だけを考えると、Nビット右にシフトすることは、2^Nで割ることと同じです。
    Bit Set最初のオペランド値が結果値に設定され、次に結果ビットのうち2番目のオペランドで示されたビットが1に設定されます。 他のビットはそのままです。
    Bit Clear最初のオペランド値が結果値に設定され、次に結果ビットのうち2番目のオペランドで示されたビットが0に設定されます。 他のビットはそのままです。
    Bit Test最初のオペランドのうち、2番目のビットで示されたビットが1の場合、trueが返されます。 最初のオペランドのうち、2番目のビットで示されたビットが0の場合、falseが返されます。

    例題

    演算例題戻り値
    Bitwise AND0x0000FFFF & 0xFF00FF000x0000FF00
    Bitwise OR (inclusive)0x0000FFFF | 0xFF00FF000xFF00FFFF
    Bitwise OR (exclusive)0x0000FFFF ^ | 0xFF00FF000xFF0000FF
    Left Bit Shift0x0000FFFF << 80x00FFFF00
    Right Bit Shift0x0000FFFF >> 80x000000FF
    Bit Set0x00000000 ?+ 160x00010000
    Bit Clear0x00010000 ?- 160x00000000
    Bit Test0x00010000 ?? 16true