这段代码的“假”输出背后的原因是什么?

Dee*_*ama 4 c comparison unsigned gcc sizeof

此 C 代码给出输出“False”并且else块正在执行。

的值为sizeof(int)4,但 的值为sizeof(int) > -10。

我不明白发生了什么。

#include <stdio.h>
void main()
{
    if (sizeof(int) > -1 )
    {
       printf("True");
    }
    else
    {
        printf("False");
    }
    printf("\n%d", (sizeof(int)) ); //output: 4
    printf("\n%d", (sizeof(int) > -1) ); //output: 0
}
Run Code Online (Sandbox Code Playgroud)

Adr*_*ica 6

您的sizeof(int) > -1测试是比较两个无符号整数。这是因为sizeof操作者返回一个size_t值,该值是的unsigned类型,所以-1值被转换为它的“等效”表示为无符号值,它实际上是在最大可能为一个值unsigned int

要解决此问题,您需要将值显式sizeof转换为 (signed) int

    if ((int)sizeof(int) > -1) {
        printf("True");
    }
Run Code Online (Sandbox Code Playgroud)

  • 因为规则是这样说的:/sf/ask/379149011/ (2认同)
  • @abelenky 确实如此(尽管那篇文章是针对 C++ 的)。来自[此 C11 标准草案](http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf) (6.3.1.8): *否则,如果操作数具有无符号整数类型的等级大于或等于另一个操作数的类型的等级,则有符号整数类型的操作数将转换为无符号整数类型的操作数的类型。* (2认同)
  • −1 按值(而不是表示形式)转换为 2^N−1,其中 N 是“size_t”中的位数。例如,−1 在二进制补码 (111…111)、二进制补码 (111…110) 和符号和数值 (100…001) 中具有不同的表示形式,但 `(size_t) -1` 始终为 2^N根据 C 标准 -1。另请注意,“size_t”可以比“int”更窄,在这种情况下,它会被提升,而“-1”则不会,并且“sizeof(int) &gt; -1”的计算结果为 true。 (2认同)