次のシグネチャを持つ関数が必要です。
bool signed_a_greater_than_signed_b(unsigned char a, unsigned char b);
その出力は、に格納されているビットの2の補数ビューがに格納されているビットの2の補数ビューよりも大きい1場合に限ります。それ以外の場合、出力はになります。例えば:ab0
signed_a_greater_than_signed_b(0b10000000,any number) => 0
signed_a_greater_than_signed_b(0b01111111,any number other than 0b01111111) => 1
signed_a_greater_than_signed_b(0b00000000,0b00000001) => 0
signed_a_greater_than_signed_b(0b00000000,0b11111111) => 1
signed_a_greater_than_signed_b(0b00000000,0b00000000) => 0
関数は暗黙的/明示的な変換を行わないようにします(これらの変換は実装定義であり、したがって移植性がないため)
そのような実装の1つは次のとおりです。
bool signed_a_greater_than_signed_b(unsigned char a, unsigned char b)
{
// if 'signed' a is positive then
// return 1 if a is greater than b or b is negative
// otherwise, if 'signed' a is negative then
// return 1 if a is greater than b and b is negative
if (a <= 0b01111111) return ((b < a) || (b > 0x01111111));
else return ((b < a) && (b > 0x01111111));
}
この計算を実行するために条件ではなく算術を使用する実装を提案できますか?必要に応じて、1つの条件を使用できます
比較とCでの算術演算で符号なし/符号付き変数を組み合わせて使用することは、災害のレシピです。この関数は、問題を回避する方法の例です。
符号付き変数の比較の背後にあるアセンブリは、実装したい関数に似ていると思います(符号付き比較をサポートしていないアーキテクチャで)