@ 4294967295 / 2 → 2147483647.5小数点以下が出ますが、これを 16進数で結果表示させると、その小数点以下を切り捨てた形、
7fffffffhとなります。これを 2倍すると、
A 7fffffffh * 2 → fffffffeh(4294967294)となります。切り捨てた値が反映されていないので、元の値には戻りません。
@ 4294967295 / 2 → 7fffffffh が表示される A (4294967295 / 2) * 2 → 結果は ffffffffh(4294967295) 表示された結果ではなく、@で計算した数値式を使用するまた、メモリを使用する事もできます。
@ 4294967295 / 2 → メモリ [0] に結果を代入するよう操作 表示は 7fffffffh 、メモリには 2147483647.5 が代入される A [0] * 2 → 結果は ffffffffh(4294967295)
-32767 → ffff8001hとなり、ffff8001h を(計算させて)10進数表示すると、
ffff8001h → 4294934529となってしまいます。計算式規則では、2 、8 、16進数は論理値として扱われるので、負の値にはなりません。
2の補数. -(not(ffff8001h)+1) → -32767
ゼロが対象の数値の場合、上記の式をそのまま使うと結果が -4294967296 になってしまいます。-(not(0)+1) → -4294967296StrCalc では、加減乗除は実数で計算されるので、関数 not が 32bit の値にした後で、+1 の計算により実数に戻るため、32bit 範囲の桁あふれが発生しない状態で結果が返されてしまいます。これは、前述の問題点とは逆のケースで、結果が 32bit整数に変換されない事が問題点になっています。 ゼロの符号反転は、結果がゼロと判っているのでほとんど行わないはずですが、対象の値がメモリの場合は意識せずに行ってしまう可能性があります。 この点を考慮するならば、論理演算またはビット演算を次のように入れます。 例.StrCalc で計算させる場合の式 -((not(対象の値)+1) | 0) -((not(対象の値)+1) & ffffffffh) -((not(対象の値)+1) ~ 0) -((not(対象の値)+1) << 0) -((not(対象の値)+1) >> 0)追加されている論理演算・ビット演算に計算としての意味はありません。StrCalc では、論理演算・ビット演算時に値を符号無し 32bit整数に変換しますので、結果が 32bit を超えなくなります。 -((not(0) + 1) | 0) → 0 追加された部分は、計算としては機能しないので、 対象の値がゼロ以外の場合でも問題ありません。 -((not(ffff8001h) + 1) | 0) → -32767 |