07/04/29 00:48:54
>>815
どうしてもなにも、定義そのままの計算式じゃん。
> 1) short tmp = (short)src - (short)dst; //< 符号付き2バイト数に拡張します
(src-dst) は、-255~+255 なので、short に納まる。
> 2) tmp = (short)(tmp * rate); //< 演算結果の下位2バイトを結果として受け取ります
(src-dst)*rate は、-65280~+65280 なので、2の補数で17ビット必要→shortだと1bit足りない→後述
> 3) tmp = (word)tmp >> 8; //< 無符号型としてシフト()
((src-dst)*rate)>>8 は -255~+255なので、2の補数で9ビット必要だが、2)の時点で9ビット目の情報は落ちている
> 4) byte result = (byte)(dst + (byte)tmp);
ここで、8ビット整数で計算するのだから、上記3)の所で、結果は8ビットあれば十分。9ビット目の値は要らない。
8ビットで演算するのに「-1(0xff)を足す」のも「255(0xff)を足す」のも、まったく同じ結果になることに気付けばOK。
3)の結果で、-255 が出てきたのを、+1 として処理してもまったく問題ない。
→ -255~-1 を +1~+255 で処理しても結果は同じ。