数値(実数、整数)
数値とは、以下を示す総称です:
- 実数のフィールド、変数、または式。 実数データタイプの範囲は、±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 + Number | Number | 2 + 3 | 5 |
減算 (引き算) | Number - Number | Number | 3 – 2 | 1 |
乗算 (かけ算) | Number * Number | Number | 5 * 2 | 10 |
除算 (割り算) | Number / Number | Number | 5 / 2 | 2.5 |
倍長整数を返す除算 | Number \ Number | Number | 5 \ 2 | 2 |
モジューロ | Number % Number | Number | 5 % 2 | 1 |
指数 | Number ^ Number | Number | 2 ^ 3 | 8 |
等しい | Number = Number | Boolean | 10 = 10 | true |
10 = 11 | false | |||
異なる | Number # Number | Boolean | 10 # 11 | true |
10 # 10 | false | |||
大きい | Number > Number | Boolean | 11 > 10 | true |
10 > 11 | false | |||
小さい | Number < Number | Boolean | 10 < 11 | true |
11 < 10 | false | |||
以上 | Number >= Number | Boolean | 11 >= 10 | true |
10 >= 11 | false | |||
以下 | Number <= Number | Boolean | 10 <= 11 | true |
11 <= 10 | false |
モジューロ
モジューロ演算子 % は最初の数値を 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 & Long | Long |
Bitwise OR (inclusive) | | | Long | Long | Long |
Bitwise OR (exclusive) | ^ | | Long ^ | Long | Long |
Left Bit Shift | << | Long << Long | Long (注記1 参照) |
Right Bit Shift | > > | Long >> Long | Long (注記1 参照) |
Bit Set | ?+ | Long ?+ Long | Long (注記2 参照) |
Bit Clear | ?- | Long ?- Long | Long (注記2 参照) |
Bit Test | ?? | Long ?? Long | Boolean (注記2 参照) |
注記
Left Bit Shift
およびRight Bit Shift
演算では、2番目のオペランドは、結果値において1番目のオペランドのビットがシフトされるビット数を示します。 したがって、この2番目のオペランドは、0~31の間でなければなりません。 0ビットシフトするとその値がそのまま返されます。また、31ビットより多くシフトするとすべてのビットがなくなるので、0x00000000が返されます。 それ以外の値を2番目のオペランドとして渡した場合、結果は意味のない値になります。Bit Set
、Bit Clear
、Bit Test
演算では、2番目のオペランドは、作用の対象となるビット番号を示します。 したがって、この2番目のオペランドは0 ~ 31の間です。そうでない場合、式の結果は意味のないものになります。
次の表は、ビットワイズ演算子とその効果を示します:
演算 | 説明 |
---|---|
Bitwise AND | それぞれの結果ビットは2つのオペランドのビットの論理ANDです。 論理AND の表は以下のようになります: |
Bitwise OR (inclusive) | それぞれの結果ビットは2つのオペランドのビットの論理OR です。論理OR の表は以下のようになります。: |
Bitwise OR (exclusive) | それぞれの結果ビットは2つのオペランドの論理XOR です。論理XOR の表は以下のようになります: |
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 AND | 0x0000FFFF & 0xFF00FF00 | 0x0000FF00 |
Bitwise OR (inclusive) | 0x0000FFFF | 0xFF00FF00 | 0xFF00FFFF |
Bitwise OR (exclusive) | 0x0000FFFF ^ | 0xFF00FF00 | 0xFF0000FF |
Left Bit Shift | 0x0000FFFF << 8 | 0x00FFFF00 |
Right Bit Shift | 0x0000FFFF >> 8 | 0x000000FF |
Bit Set | 0x00000000 ?+ 16 | 0x00010000 |
Bit Clear | 0x00010000 ?- 16 | 0x00000000 |
Bit Test | 0x00010000 ?? 16 | true |