gpt4 book ai didi

C 转换比较值时的处理

转载 作者:太空狗 更新时间:2023-10-29 15:29:20 25 4
gpt4 key购买 nike

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

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

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

最佳答案

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

  unsigned int a;

/* ... */

a > -1

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

 a > (unsigned int) -1

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

现在,如果 acharint 类型,则 -1 不会转换为 unsigned int 因此 0 > -1 为真 (1),正如预期的那样。

关于C 转换比较值时的处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21563117/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com