在C语言中寻找char的最大值

5

我正在通过简单的加法运算并测试数字变为负数时来寻找char的最大值:

#include<stdio.h>

/*find max value of char by adding*/
int main(){
  char c = 1;

  while(c + 1 > 0)
    ++c;

  printf("Max c = %d\n",(int)c);  /*outputs Max c = -128*/
  return 0;
}
while循环进行预先测试,所以第一次c+1为负数时会中断循环,并打印出c的值。然而,该编程输出的是负数!为什么这个程序没有输出127

我会使用limits.h来完成这个任务。但如果你坚持的话,可以将int作为计数器,并将其与转换为char类型的计数器进行比较 c != (char) c - KIIV
2个回答

5

在 while 条件语句中发生了隐式转换,导致比较操作作用于 int 而不是 char。

如果您将其更改为

while((char)(c + 1) > 0)
    ++c;

然后它会打印出127。


4
正确...除了我认为正确的术语应该是"整数提升",而不是"隐式转换"...? - phonetagger
1
@phonetagger 感谢您的评论。我的理解是,整数提升是隐式转换的一个特定情况,因此这两个术语在技术上都是正确的。 - bgoldst
1
“整数提升”是可搜索的,以防有人想了解更多相关信息。 - anatolyg
1
不存在所谓的“隐式转换”。强制转换是显式的转换;强制转换运算符由括在圆括号中的类型名称组成。不使用强制转换的转换是隐式转换 - Keith Thompson

0

有符号整数溢出是未定义行为。这意味着符合标准的 C 编译器可以将 c + 1 > 0 更改为 true,因为加法“不可能”溢出。

这意味着您的程序可能会被编译成无限循环。


虽然这可能是真的,但它并不能解释OP观察到的行为。 - phonetagger
只有当 INT_MAX == CHAR_MAX 时,这才是未定义的。 - EOF
1
@EOF - 我不确定这是正确的。表达式 c + 1 的右侧是类型为 int,而左侧是一个较小的类型,因此该表达式的整个结果是一个 int。因此比较 c + 1 > 0 是将一个 int 与零(另一个 int,但是特殊的)进行比较。 - phonetagger
@phonetagger:我不确定你的意图。如果以int精度评估c+1,且c是INT_MAX,则表达式(c+1<0)未定义。如果c的类型是char,而char等同于signed char,并且INT_MAX == CHAR_MAX,则确实会发生这种情况。如果CHAR_MAX < INT_MAX,则不可能发生这种情况。 - EOF
@EOF - 我不明白 CHAR_MAX < INT_MAXCHAR_MAX == INT_MAX 与此有任何关系。无论 c 的类型是什么,在此代码将 1 加到它之前,它已经被提升为一个 int。因此,优化器可能会看到表达式 c + 1,并知道 c 的初始值为 1,唯一的重新赋值是将其递增,推断出 c + 1 的结果必定大于零(因为有符号整数溢出是未定义的)。因此,我不明白 INT_MAXCHAR_MAX 之间的关系与此有任何关系。 - phonetagger
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接