【问题标题】:Finding max value of char in C在C中找到char的最大值
【发布时间】:2016-11-29 07:12:13
【问题描述】:

我通过简单的加法和测试数字何时变为负数来找到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 的计数器进行比较

标签: c char max limit ansi-c


【解决方案1】:

Signed integer overflow is undefined behavior。这意味着允许符合标准的 C 编译器将 c + 1 &gt; 0 更改为 true,因为添加“不能”溢出。

这意味着您的程序可以合法地编译为无限循环。

【讨论】:

  • 虽然这可能是真的,但它并不能解释 OP 观察到的行为。
  • 只有在INT_MAX == CHAR_MAX时才定义。
  • @EOF - 我不确定这是否正确。表达式c + 1 的右侧是int 类型,其左侧是较小的类型,因此该表达式的整个结果是int。所以比较c + 1 &gt; 0 是一个int 与零比较(另一个int,但是一个特殊的)。
  • @phonetagger:我不知道你要去哪里。如果c+1int-precision 处计算,并且cINT_MAX,则表达式(c+1&lt;0) 未定义。如果c 是char 类型,char 等价于signed char,而INT_MAX == CHAR_MAX,这确实会发生。如果CHAR_MAX &lt; INT_MAX,则不能。
  • @EOF @phonetagger 无论哪种方式,如果char 已签名且cCHAR_MAX,则循环主体中的++c; 仍未定义(或可能已定义实现)。
【解决方案2】:

在 while 条件中发生了一个隐式转换,导致比较在整数而不是字符上工作。

如果你改成

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

然后它将打印 127。

【讨论】:

  • 正确...除了我认为正确的术语是“整数提升”,而不是“隐式转换”...?
  • @phonetagger 感谢您的评论。我的理解是整数提升是隐式转换的一种特殊情况,因此这两个术语在技术上都是正确的。
  • “整数推广”是可搜索的,以防有人想了解更多信息
  • 没有“隐式强制转换”之类的东西。强制转换是显式转换;强制转换运算符由括号中的类型名称组成。不使用强制转换的转换是隐式转换
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-19
  • 2011-07-12
  • 2021-12-17
相关资源
最近更新 更多