代码之家  ›  专栏  ›  技术社区  ›  WonFeiHong

通过sizeof会发生什么

  •  -1
  • WonFeiHong  · 技术社区  · 7 年前

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

        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 回复  |  直到 7 年前
        1
  •  8
  •   StoryTeller - Unslander Monica    7 年前

    sizeof 计算为常数 std::size_t 类型它是一种无符号类型,大小足以包含程序中任何对象的大小。上一句中的关键字是 未签名 .

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

    但在另一种情况下,您将 标准::size\u t 变成一个 int 通过初始化(准确地说,复制初始化,但这不重要)。值 sizeof公司 实际上,操作员返回可能不适合 内景 ,在这种情况下,将不会保留该值。但在您的情况下,它确实是合适的(基本类型相当小),并且在比较积极的 内景 反对 -1 .

        2
  •  5
  •   Christian Hackl    7 年前

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

    将无符号整数与负数进行比较时,如 -1 如果位长度相等或较小,则负数被解释为其单个位代表一个巨大的正数,因此比较是错误的。

    这个 int n = sizeof(int); 由于返回的无符号整数值 sizeof公司 首先变成 int ,已签名。因此,最后比较两个有符号整数,这以预期的算术方式工作。