C 转换比较值时的处理

Tan*_*aki 4 c comparison casting implicit-conversion

有人和我谈论 C 中的环绕(0xffff + 0x0001 = 0x0000),这让我陷入了以下情况:

int main() {
  unsigned int a;
  for (a = 0; a > -1; a++)
    printf("%d\n", a);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

使用 GCC 编译,该程序退出而不运行循环,我认为这是因为-1被隐式强制转换为0xffff. 切换int到时也会发生同样的情况long。但是,当切换到 时char,程序会无限期地运行。我希望因为int没有运行循环,所以char. 有人可以解释编译器在这种情况下执行的隐式转换类型,它是在 C 标准的一个版本中定义的还是依赖于编译器的?

oua*_*uah 5

在 C 中,无符号是粘性的:

  unsigned int a;

  /* ... */

  a > -1
Run Code Online (Sandbox Code Playgroud)

在上面的>表达式中,左操作数的类型为unsigned int,右操作数的类型为int。C 常用算术转换将两个操作数转换为通用类型:unsigned int因此>上面的表达式等效于:

 a > (unsigned int) -1
Run Code Online (Sandbox Code Playgroud)

-1to的转换unsigned int使结果值成为一个巨大的unsigned int值,并且由于a 初始值是0,表达式的计算结果为 false ( 0)。

现在 ifa的类型为charor int-1则不会转换为 true ( ) unsigned int,因此如预期的那样。0 > -11