我正试图绕过通常的算术转换并尝试测试:
(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。
如果不满足前两个条件,并且任何一个操作数都是 long类型,另一个操作数转换为long类型。
如果不满足前面三个条件,并且任何一个操作数 是unsigned int类型,另一个操作数转换为type unsigned int。
如果不满足上述条件,则两个操作数均为 转换为int。
最后一个子弹说,如果没有满足其他任何条件,则两个操作数都将被赋予int类型。在这个unsigned char(max_char)之后将只有一些填充了一些模式,而signed char(-1)将只有一些填充了一些模式。这将意味着1> 1 ==假,但我得到了真实。有什么想法吗?
答案 0 :(得分:3)
你说的是最后一个项目符号是正确的,所以两个操作数都转换为int
类型。左侧是(unsigned char)255
,右侧是(signed char)-1
。由于255和-1都可以表示为int
,因此它们分别转换为(int)255
和(int)-1
,并且由于255大于-1,因此返回true
。