通过sizeof将会发生什么

时间:2017-12-10 12:34:44

标签: c++ sizeof

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

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

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

    int n = sizeof(int);

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

任何人都可以向我解释发生了什么吗?谢谢。

2 个答案:

答案 0 :(得分:8)

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

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

但在另一种情况下,您可以通过初始化将std::size_t转换为int(准确地说,复制初始化,但它在此点旁边)。 sizeof运算符返回的值实际上可能不适合int,在这种情况下,值不会被保留。但是在你的情况下它确实适合(基本类型相当小),并且在将int-1进行比较时得到了预期的结果。

答案 1 :(得分:5)

sizeof的结果是std::size_t值,而且是无符号整数类型。换句话说,它不能是负面的。

当您将无符号整数与具有相等或较小位长的-1的负数进行比较时,负数将被解释为其各个位表示一个巨大的正数,因此比较为假。

int n = sizeof(int);案例按预期工作,因为sizeof返回的无符号整数值首先变为int,并且已签名。因此,您最终会比较两个有符号整数,它们以预期的算术方式工作。