私は通常の算術変換に頭を悩ませようとしていて、テストしようとしました:
(static_cast<unsigned char>(std::numeric_limits<unsigned char>::max()) > static_cast<signed char>(-1))
これは true と評価されますが、これは問題ありませんが、算術変換によると、false になるはずです (最後の箇条書き):
整数昇格は、次のようにオペランドで実行されます。
いずれかのオペランドが unsigned long 型の場合、もう一方のオペランドは unsigned long 型に変換されます。
上記の条件が満たされない場合、およびいずれかのオペランドが long 型で、もう一方が unsigned int 型である場合、両方のオペランドが unsigned long 型に変換されます。
上記の 2 つの条件が満たされない場合、およびいずれかのオペランドが long 型の場合、もう 1 つのオペランドは long 型に変換されます。
上記の 3 つの条件が満たされない場合、およびいずれかのオペランドが unsigned int 型の場合、もう一方のオペランドは unsigned int 型に変換されます。
上記の条件のいずれも満たされない場合、両方のオペランドが int 型に変換されます。
最後の箇条書きは、他の条件が満たされない場合、両方のオペランドが int 型に変換されることを示しています。この unsigned char(max_char) に続くビット パターンは 1 のみで埋められ、signed char(-1) はビット パターンが 1 のみで埋められます。これは 1 > 1 == false を意味しますが、私は true を取得しています。何かご意見は?