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

时间:2012-05-08 17:26:23

标签: c visual-c++

int i=9999;  

char c=i;  

没有溢出警告,而

char c=9999;  

给出,

  

警告C4305初始化从int到char的截断

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

2 个答案:

答案 0 :(得分:9)

使用/ W4进行编译时,您将获得warning C4244(您应该始终)。

  

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

答案 1 :(得分:1)

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

char c=9999;

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

int i=9999;  

char c=i;

这具有相同的语义,但是对于编译器警告c的初始化,它必须知道i具有值9999(或至少一个值)在分析该声明时,在char)范围之外。假设你写了:

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

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

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

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