通过 sizeof 会发生什么

What will happen passing sizeof

我有这个问题我不明白为什么我得到的结果不正确:

    if(sizeof(int) > -1)
        cout << "true" << endl;
    else
        cout << "false" << endl;

上面也总是打印false!但下面是正确的:

    int n = sizeof(int);

    // correct
    if(n > -1)
        cout << "true" << endl;
    else
        cout << "false" << endl;

谁能给我解释一下发生了什么事?谢谢。

sizeof 评估为 std::size_t 类型的常量。这是一个无符号类型,大到足以包含程序中任何对象的大小。上一句关键字是unsigned.

当您编写 sizeof(int) > -1 时,C++ 中的整数提升规则规定关系运算符的两个操作数将转换为相同类型(足够大的类型)。这是无符号类型。所以 -1 被转换为一些非常大的数字。 SIZE_MAX 准确地说。直接比较将始终评估为 false。

但在另一种情况下,您通过初始化将 std::size_t 转换为 int(准确地说是复制初始化,但这不是重点)。 sizeof 运算符 returns 的值实际上可能不适合 int,在这种情况下,该值将不会被保留。但在你的情况下它确实适合(基本类型相当小),并且在将正 int-1.

进行比较时你会得到预期的结果

sizeof 的结果是一个 std::size_t 值,这是一个无符号整数类型。也就是说,不能为负。

当您将无符号整数与位长度相等或更小的负数(如 -1)进行比较时,负数会被解释为它的各个位代表一个巨大的正数,因此比较是假的。

int n = sizeof(int); 案例按预期工作,因为 sizeof 返回的无符号整数值首先转换为带符号的 int。因此,您最终得到两个有符号整数的比较,它以预期的算术方式工作。