4

重複の可能性:
符号付き/符号なしの比較

したがって、以下のコードがあります。これは、unsigned intを負の数に設定し、unsignedintを同じ負の数と比較します。私が得る出力は「等しくない」です。unsigned intを-1に設定すると、この場合、unsignedintの値が255に設定されることを理解しています。

#include <stdint.h>
#include <iostream>

int main(int argc, char **argv)
{
  uint8_t test = 0;
  int8_t set = -1;

  test = set;

  if (test == set) {
    std::cout << "Equal";
  } else {
    std::cout << "Not Equal";
  }
}

ただし、等式オペランドがfalseを返す原因は何ですか?これは、同様の質問に対する回答とは正反対のようです。

算術型または列挙型のオペランドを期待する多くの二項演算子は、同様の方法で変換を引き起こし、結果型を生成します。目的は、結果のタイプでもある共通のタイプを生成することです。このパターンは通常の算術変換と呼ばれ、次のように定義されます。

いずれかのオペランドがlongdouble型の場合、もう一方はlongdoubleに変換されます。

それ以外の場合、一方のオペランドがdoubleの場合、もう一方はdoubleに変換されます。

それ以外の場合、一方のオペランドがfloatの場合、もう一方はfloatに変換されます。

それ以外の場合、積分昇格(4.5)は両方のオペランドで実行されるものとします54)。

次に、一方のオペランドがunsigned longの場合、もう一方はunsignedlongに変換されます。

それ以外の場合、一方のオペランドがlong intで、もう一方のunsigned intである場合、longintがunsignedintのすべての値を表すことができる場合、unsignedintはlongintに変換されます。それ以外の場合は、両方のオペランドがunsignedlongintに変換されます。

それ以外の場合、一方のオペランドがlongの場合、もう一方はlongに変換されます。

それ以外の場合、一方のオペランドが符号なしの場合、もう一方は符号なしに変換されます。

したがって、この回答によれば、両方のオペランドが符号なしであるため、もう一方は符号なしに変換され、等式が渡されるはずです。しかし、それは明らかに通過しておらず、この質問ですでに答えられているように、それらは両方とも署名されたintとして宣伝されています。

4

1 に答える 1

9

確かに、それは標準的な動作です。よりも小さい型は、および他のほとんどの演算子と一緒に使用した場合にint昇格されます。Soは に昇格し、値は 255 になります。 Andは に昇格しますが、これは負の数であるため、昇格前と昇格後の両方の値は -1 です。255 は -1 と等しくないため、比較すると が得られます。int==testintsetintfalse

教訓は次のとおりです。比較で符号付きと符号なしの型を混在させる場合は注意してください。

于 2012-11-07T19:20:42.063 に答える