重複の可能性:
符号付き/符号なしの比較
したがって、以下のコードがあります。これは、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として宣伝されています。