0

私は通常の算術変換に頭を悩ませようとしていて、テストしようとしました:

(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 を取得しています。何かご意見は?

4

1 に答える 1

3

最後の箇条書きが使用されるのは正しいので、両方のオペランドが type に変換されますint。左側が(unsigned char)255、右側が です(signed char)-1。255 と -1 はどちらも として表現できるため、それぞれ とintに変換されます。255 は -1 より大きいため、 が返されます。(int)255(int)-1true

于 2012-11-01T15:00:25.050 に答える