【问题标题】:why no overflow warning when converting int to char为什么将int转换为char时没有溢出警告
【发布时间】:2012-05-08 17:26:22
【问题描述】:
int i=9999;  

char c=i;  

不给出溢出警告,While

char c=9999;  

给,

警告 C4305 将截断从 int 初始化为 char

为什么在将int 转换为char 时没有溢出警告?

【问题讨论】:

  • @pmg:不,它们都是初始化。
  • 你是对的@KeithThompson,谢谢。我删除了错误的评论。
  • @pmg 你的那条评论让我非常困惑,我不得不将它发布在一个单独的问题中。这就是你所说的--It's not the same thing. The first is an assignment, the second is an initialization。这是链接stackoverflow.com/questions/16500028/…跨度>
  • @Rüppell'sVulture:很抱歉。
  • @pmg 实际上,像我这样的 StackOverflow 普通人不会期望像你这样拥有 25k+ 声望的 ace 会出现 ANY 错误..LOL..

标签: c visual-c++


【解决方案1】:

使用 /W4 编译时,您会得到 warning C4244(您应该始终这样做)。

警告 C4244:“正在初始化”:从“int”转换为“char”,可能会丢失数据

【讨论】:

  • :(我忘了启用最高警告。谢谢
  • 请注意,该警告并未考虑i 的值恰好是9999 的事实。编译器可能会对int i = 42; char c = i; 发出相同的警告
【解决方案2】:

任何代码结构是否产生警告取决于编译器的聪明程度及其作者的选择。

char c=9999;

9999 是一个常量表达式。编译器可以通过分析没有附加上下文的声明来确定它将溢出。 (大概普通的char 是有符号的;如果它是无符号的,则转换是明确定义的——但编译器仍然可以选择警告它。)

int i=9999;  

char c=i;

这具有相同的语义,但要让编译器警告c 的初始化,它必须知道i 的值9999(或至少一个超出@987654329 范围的值@) 分析该声明时。假设您改为写:

int i = 9999;
i = 42;
char c = i;

那么显然没有必要或适当的警告。

正如James McNellis's answer 所指出的,一个足够聪明的编译器可以警告任何一种情况,如果它对程序执行期间将要发生的事情进行额外的分析。对于某些编译器,它有助于启用优化,因为优化代码(不破坏代码)所需的分析也可以揭示这种潜在的运行时错误。

我会注意到这是对您提出的问题的回答:为什么没有警告。您接受的答案是隐含问题:“我想要在此处发出警告;我该如何启用它?”。我不是在抱怨,只是在观察。

【讨论】:

  • +1。 pmg 也承认关于一个是初始化而另一个是分配的评论是错误的。现在整个事情都很清楚了。感谢您花时间提出 2 个很好的答案。
猜你喜欢
  • 2011-06-25
  • 2014-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-01
  • 2013-10-05
  • 1970-01-01
相关资源
最近更新 更多