6

有人可以告诉我为什么if条件为假吗?

#include <iostream>
using namespace std;

int main(int argc, char *argv[])
{
    int a;
    unsigned int ua;

    a = -1;
    ua = a;

    cout << "ua: " << ua << endl;
    if (ua != -1)
        cout << "Is unsigned" << endl;
    else
        cout << "Is signed" << endl;

    return 0;
}

我的意思是,这里 ua == int_max_value,它不是 -1,但是当我运行它时,输出是

已签署

4

2 回答 2

4

!===on 算术类型对其操作数执行所谓的通常算术转换。与此处相关,给定一个类型的操作数unsigned X和一个类型的操作数signed X,其中X是和之一int,通常的算术转换在进行比较之前将有符号操作数转换为无符号类型。longlong long

因此,当您比较ua(of type unsigned int) 和-1(of type signed int) 时,-1将转换为 type unsigned int(从概念上讲,通过向其添加 2 32,假设 32-bit int),结果比较等于 的值ua

于 2014-08-27T02:37:37.883 回答
1

这是预期的行为,如果它们是算术类型,!=将对它的操作数执行通常的算术转换。这在草案 C++ 标准部分5.10 平等运算符中有所介绍,其中说:

如果两个操作数都是算术或枚举类型,则对两个操作数执行通常的算术转换;如果指定的关系为 true,则每个运算符都应返回 true,如果为 false,则返回 false。

在这种情况下,这将导致整数提升,它将-1被转换为无符号整数。5这在第10节中有所介绍,最后说:

否则,如果无符号整数类型的操作数的秩大于或等于另一个操作数类型的秩,则将有符号整数类型的操作数转换为无符号整数类型的操作数的类型。

于 2014-08-27T02:37:59.833 回答