私は誰かの宿題を手伝っていて、この奇妙な問題に遭遇しました。問題は、符号付き整数のバイトの順序を逆にする関数を作成することです (とにかく関数が指定された方法です)。これが私が思いついた解決策です:
int reverse(int x)
{
int reversed = 0;
reversed = (x & (0xFF << 24)) >> 24;
reversed |= (x & (0xFF << 16)) >> 8;
reversed |= (x & (0xFF << 8)) << 8;
reversed |= (x & 0xFF) << 24;
return reversed;
}
この関数に渡す0xFF000000
と、最初の代入は になり0xFFFFFFFF
ます。何が起こっているのかよくわかりませんが、署名付きと未署名の間の変換、またはそのようなものと関係があることは知っています。
追加ul
すると正常に0xFF
動作します。これは、強制的に署名なしに変換されてから、署名付きまたはその方向の何かに変換されるためだと思います。結果のコードも変更されます。指定子がないul
場合は sar(算術右シフト) を使用しますが、符号なしでは意図したとおりに shr を使用します。
誰かが私のためにこれに光を当てることができれば、本当に感謝しています。私はこのことを知っているはずであり、知っていると思っていましたが、ここで何が起こっているのか本当にわかりません.
前もって感謝します!