if语句中的sizeof()运算符

Raj*_*yan 39 c sizeof

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

它打印False.为什么sizeof()不返回值if?

unw*_*ind 54

  1. sizeof它不是一个功能,它是一个操作员.括号不是运算符名称的一部分.
  2. 它失败了,因为生成的值具有无符号类型size_t,这导致"通常的算术转换" -1转换为无符号,在这种情况下,它是一个非常大的数字.

基本上你正在比较4 > 0xffffffffu,或者至少接近它.有关详情,请参阅此问题.

  • 将"-1"转换为无符号整数类型总是产生最大值,即使表示不是二进制补码 (11认同)
  • 你的第一点是真的,但无关紧要.返回`size_t`的函数也是如此. (6认同)
  • 严格地说,这里没有整数提升,而是_balancing_(正式称为"_通常的算术转换_"). (4认同)

小智 24

无符号和有符号整数提升(更确切地说,是"通常的算术转换").sizeof产生一个类型的值size_t,当与无符号值(即size_t)相比时,-1被提升为该类型,并且溢出并变得巨大.

无符号整数溢出具有明确定义的行为,并且将被视为模2 ^ width,其中width是特定无符号整数类型中的位数.所以,如果你有一个32位宽size_t并且int,例如,你的比较将相当于用

if (4 > 4294967295u)
Run Code Online (Sandbox Code Playgroud)

这显然是假的.


Lun*_*din 12

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

这些状态(C11 6.3.1.8):

...

否则,如果带有符号整数类型的操作数的类型可以表示具有无符号整数类型的操作数类型的所有值,则具有无符号整数类型的操作数将转换为带有符号整数类型的操作数的类型.

否则,两个操作数都转换为无符号整数类型,对应于带有符号整数类型的操作数的类型.

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

  • "在这样的变量中存储-1时发生的任何事情都是实现定义的行为." 嗯,这里唯一依赖于实现的东西是`size_t`的宽度.将"-1"转换为无符号类型是强制要求标准生成该类型的最大值. (8认同)
  • 虽然`-1`的位模式不必是'0xFF..F`,但是`-1`(从有符号整数类型)转换为无符号整数类型的结果总是(好吧,除非宽度不是4的倍数具有位模式"0xFF ... F".这是由标准[模仿as-if规则]强制执行的. (3认同)