1
int i=9999;  

char c=i;  

不给出溢出警告,而

char c=9999;  

给,

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

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

4

2 回答 2

9

使用 /W4 编译时会收到警告 C4244(您应该始终这样做)。

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

于 2012-05-08T17:28:07.873 回答
1

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

char c=9999;

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

int i=9999;  

char c=i;

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

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

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

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

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

于 2013-05-11T18:15:21.927 回答