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 标准的一个版本中定义的还是依赖于编译器的?
在 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