【问题标题】:Comparing ints gives strange results比较整数会产生奇怪的结果
【发布时间】:2012-11-01 14:55:54
【问题描述】:

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

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

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

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

如果任一操作数的类型为无符号长整数,则另一个操作数为 转换为 unsigned long 类型。

如果前面的条件不满足,并且任一操作数的类型为 long 和另一个 unsigned int 类型,两个操作数都转换为 输入 unsigned long。

如果前面两个条件不满足,并且任一操作数是 long 类型的,另一个操作数被转换为 long 类型。

如果前面三个条件都不满足,并且任一操作数 是 unsigned int 类型,另一个操作数转换为类型 无符号整数。

如果前面的条件都不满足,则两个操作数都是 转换为 int 类型。

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

【问题讨论】:

    标签: c++


    【解决方案1】:

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

    【讨论】:

    • #Adam 这让我更加困惑 ;).255 因为 int 有模式 0000 ... 1111 1111 并且 -1 只填充了一个。这怎么可能 0000 ... 1111 1111 大于 1111 ... 1111 1111 ?
    • @smallB:因为它们是有符号整数。无论它们如何表示(二进制补码、一个补码或符号大小),重要的是 numeric 值。在普通算术中,255 总是大于 -1 的值。
    • #Adam 所以他们的类型实际上被考虑到了吗?我以为只比较位模式,但看起来这些操作数的类型起着重要作用,对吗?
    猜你喜欢
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 2015-10-04
    • 1970-01-01
    • 1970-01-01
    • 2012-03-14
    相关资源
    最近更新 更多