0

我试图了解通常的算术转换并尝试测试:

(static_cast<unsigned char>(std::numeric_limits<unsigned char>::max()) > static_cast<signed char>(-1))

这评估为真,这没关系,但根据算术转换它应该导致假(最后一个项目符号):

对操作数执行积分提升,如下所示:

如果任一操作数是 unsigned long 类型,则另一个操作数将转换为 unsigned long 类型。

如果不满足前面的条件,并且如果一个操作数是 long 类型而另一个是 unsigned int 类型,则两个操作数都将转换为 unsigned long 类型。

如果不满足上述两个条件,并且其中一个操作数是 long 类型,则将另一个操作数转换为 long 类型。

如果不满足上述三个条件,并且其中一个操作数是 unsigned int 类型,则将另一个操作数转换为 unsigned int 类型。

如果上述条件都不满足,则两个操作数都转换为 int 类型。

最后一个项目符号表示,如果不满足其他条件,则两个操作数都将转换为 int 类型。在此 unsigned char(max_char) 之后,位模式将仅填充为 1,而 signed char(-1) 将具有仅以 1 填充的位模式。这意味着 1 > 1 == false,但我得到了正确的结果。有什么想法吗?

4

1 回答 1

3

没错,最后一个项目符号是使用的项目符号,因此两个操作数都转换为 type int。左边是(unsigned char)255,右边是(signed char)-1。由于 255 和 -1 都可以表示为int,因此它们分别转换为(int)255(int)-1,并且由于 255 大于 -1,因此返回true

于 2012-11-01T15:00:25.050 回答