通过sizeof将会发生什么

Won*_*ong -1 c++ sizeof

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

    if(sizeof(int) > -1)
        cout << "true" << endl;
    else
        cout << "false" << endl;
Run Code Online (Sandbox Code Playgroud)

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

    int n = sizeof(int);

    // correct
    if(n > -1)
        cout << "true" << endl;
    else
        cout << "false" << endl;
Run Code Online (Sandbox Code Playgroud)

谁能向我解释发生了什么?谢谢.

Sto*_*ica 8

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

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

但在另一种情况下,您将转换std::size_tint通过初始化(准确地复制初始化,但它在旁边).sizeof操作符返回的值实际上可能不适合int,在这种情况下,该值不会被保留.但在你的情况下它确实适合(基本类型相当小),并且在比较积极的int反对时得到预期的结果-1.


Chr*_*ckl 5

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

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

int n = sizeof(int);情况按预期工作,因为返回的无符号整数值sizeof首先变为a int,这是有符号的.因此,您最终会对两个有符号整数进行比较,这些整数以预期的算术方式工作.