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

数値 (実数、倍長整数、整数)

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

  • 実数のフィールド、変数、または式。 実数データタイプの範囲は、±1.7e±308 (有効数字13桁) です。
  • 倍長整数のフィールド、変数、または式。 倍長整数 (4バイト整数) データタイプの範囲は、-2^31..(2^31)-1です。
  • 整数のフィールド、変数、または式。 整数 (2バイト整数) データタイプの範囲は、-32,768..32,767 (2^15..(2^15)-1)です。

注: 整数フィールドの値は、4D ランゲージで使用される際には自動的に倍長整数に変換されます。

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

注: 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) からです。
danger

モジューロ演算子 % は倍長整数の範囲内 (-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)|Long | LongLong
Bitwise OR (exclusive)^ |Long ^ | 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つのオペランドのビットの排他的論理ORです。下記は、排他的論理ORの真偽表です:
  • 1 ^ | 1 --> 0
  • 0 ^ | 1 --> 1
  • 1 ^ | 0 --> 1
  • 0 ^ | 0 --> 0
  • すなわち、オペランドのビットのいずれか一方だけが 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