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

int i=9999; char c=i; 

没有溢出警告,而

 char c=9999; 

给,

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

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

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

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

任何代码构造是否产生警告都取决于编译器的聪明性和作者的选择。

 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的回答所指出的那样,一个足够聪明的编译器可以警告这两种情况,如果它对程序执行期间将要发生的事情进行额外的分析。 对于某些编译器,它有助于实现优化,因为优化代码所需的分析(不破坏它)也可以揭示这种潜在的运行时错误。

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