固定小数点数の乗算問題を解こうとしています。数値は 32 ビットです。私のアーキテクチャは 8 ビットです。だからここに行きます:
私は 8.8 表記を使用しています。つまり、整数には 8、小数には 8 です。
私は10.468であるA78を持っています。その 2 の補数を取ると、答えは FFFFF588 で、これを F588 として 16 ビットに切り捨てて格納します。理由は、2 つの 2 バイト数だけを掛けたいからです。
この F588 (負の 10.42 または 0x0A78) に 0x00B5 (0.707) の 2 の補数である 0xFF4B を掛けると、答えは 0x0766 になります。またはそのようなもの。
一方、私が得たのは66D8です。
B5 の負数を 32 ビットの 2 の補数で格納すると、0xFF5266D8 が得られ、これを右に 8 ビットシフトし、切り捨てて 16 ビットにすると、答えは 0x5266 になります。
一方、代わりに負の 10.42 を 32 ビットで格納すると、0xF58F66D8 が得られます。これは、8 ビットをシフトして切り捨てた後、8F66 になります。
しかし、両方の数値を 32 ビット形式で保存すると、シフトと切り捨ての後で正しい結果 (0x0766) が得られます。
なぜこうなった?32 ビットから 16 ビットに移行すると情報の損失が本質的に発生することは理解していますが、0x07 は 0x55 とは大きく異なります。私は応答に絶対に感謝します。