if语句中的sizeof()运算符

时间:2013-06-25 09:31:11

标签: c sizeof

#include <stdio.h>
int main(void)
{
    if (sizeof(int) > -1)
        printf("True");
    else
        printf("False");
}

打印False。为什么sizeof()不返回if中的值?

5 个答案:

答案 0 :(得分:54)

  1. sizeof不是函数,它是一个运算符。括号不是运营商名称的一部分。
  2. 它失败了,因为生成的值具有无符号类型size_t,这导致“通常的算术转换”,其中-1被转换为无符号,在这种情况下,它是一个非常大的数字。
  3. 基本上你比较4 > 0xffffffffu,或者至少接近它的东西。 See this question了解详情。

答案 1 :(得分:24)

无符号和有符号整数提升(更确切地说,是“通常的算术转换”)。 sizeof生成类型为size_t的值,当与无符号值(size_t为)进行比较时,-1将提升为该类型,并溢出并变为巨大。

无符号整数溢出具有明确定义的行为,并且将被视为模2 ^ width,其中width是特定无符号整数类型中的位数。因此,如果你有一个32位宽的size_tint,那么你的比较将等同于

if (4 > 4294967295u)

这显然是假的。

答案 2 :(得分:12)

  • &gt;的操作数if语句中的运算符为sizeof(int)-1
  • sizeof(int)的类型为size_t,保证为无符号整数。在实践中,size_t很可能至少与任何系统上的unsigned int一样大。
  • -1的类型为int,相当于signed int
  • 不会发生整数提升,因为两个操作数都足够大。
  • 然后根据正式称为通常的算术转换的C规则,两个操作数平衡

这些状态(C11 6.3.1.8):

  

...

     

否则,如果带有符号整数类型的操作数的类型可以   表示带有unsigned的操作数类型的所有值   整数类型,然后转换具有无符号整数类型的操作数   到带有符号整数类型的操作数的类型。

     

否则,两者兼而有之   操作数转换为对应的无符号整数类型   带有符号整数类型的操作数的类型。

  • 上述后一种情况会发生,因为(签名)int无法适合size_t的所有值。
  • 因此-1被转换为无符号整数。实际上,size_t很可能等同于unsigned int或unsigned long。无论在这样的变量中存储-1是什么,都是实现定义的行为。
  • 在二进制补码计算机上(世界上99.9%的计算机),-1将被解释为0xFFFFFFFF(FF的数量取决于给定系统上int的大小)。
  • 4 > 0xFFFFFFFF评估为false。

答案 3 :(得分:2)

Sizeof是一个导致unsigned long int的运算符。因此,当您将unsigned long int与-1进行比较时,将其存储为0xffffffff(int的大小为4个字节)。

默认情况下,

-1是有符号整数。但是,在signed int和unsigned int之间进行比较时,编译器会将signed int的隐式类型转换为unsigned int。这导致无符号-1大约等于4.6giga值。

因此,输出为false

答案 4 :(得分:1)

试试这个并亲自看看

#include <stdio.h>
main() {
    unsigned int a=4;
    int b = -1;
    //this is what you're doing
    printf("%u vs %u\n", a, (unsigned int)b);
    //this is what you want to do instead
    printf("%d vs %d\n", (int)a, b);
}