これなんかものすごく初歩的なミスかもしれないのですが、はまり中。
a = 0xeeeeeeee;
b = a/2;
trace([b, b.toString(16)]);
b = Math.round(b);
trace([b, b.toString(16)]);
[output]
2004318071,77777777
2004318071,77777777
特に問題なし。で、端数がでるものをMath.roundで丸めてみる
a = 0xffffffff;
b = a/2;
trace([b, b.toString(16)]);
b = Math.round(b);
trace([b, b.toString(16)]);
[output]
2147483647.5,7fffffff
2147483648,-(0000000
丸めないのはまぁ予想通り。余計な親切心で丸めた結果のものは-(0000000となった。えーっとこれは何だろう?0x80000000だと思ったりしたんだけど、何故に“(“なのだろう?なんか基本的な16進数の考え方が間違っているのだろうか?頭が回らない・・・・。
ついでにもう一つ念のため、他に端数の出る除算
a = 0x77777777;
b = a/2;
trace([typeof (b), b, b.toString(16)]);
b = Math.round(b);
trace([typeof (b), b, b.toString(16)]);
[output]
number,1002159035.5,3bbbbbbb
number,1002159036,3bbbbbbc
特におかしくないよなぁ・・・(;´Д`)
「16進数演算」への4件の返信
丸めとは関係なく、単純に int 型の最大値が2147483647なので
最上位ビットが符号ビットとして使われているだけだと思います。
ということは、アルファ情報は128階調になっちゃうのかな・・・
なるほど、そういうことですか・・
>int 型の最大値が2147483647
これが全然記憶に引っかかりませんでした・・・(;´Д`)
ということは0x7fffffffが上限になるのかしら?
intに上限あるならば、
HI、LOWと二つのint型変数をつくって、上位、下位をまたぐ計算ルーチンを作るってのはどうでしょう?
4bitとか8bitのマイコンではよく使ってました、こういう技。
めんどくさいですけど・・・
>4bitとか8bitのマイコンではよく使ってました、こういう技。
そ・・そうなのですかー。
プログラムって難しいなぁ・・・・・。勉強しなくては