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

为什么在将int转换为char时没有溢出警告,c,visual-c++,C,Visual C++,不提供溢出警告,而 int i=9999; char c=i; 给 警告C4305初始化从int到char的截断 为什么在将int转换为char时没有溢出警告?在使用/W4编译时,您会得到溢出警告,您应该一直这样做 警告C4244:“正在初始化”:从“int”转换为“char”,可能会丢失数据 任何代码构造是否产生警告取决于编译器的聪明程度及其作者的选择 char c=9999; 9999是一个常量表达式。编译器只需在没有附加上下文的情况下分析声明,就可以确定它将溢出。假定纯字

不提供溢出警告,而

int i=9999;  

char c=i;  

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

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

在使用/W4编译时,您会得到溢出警告,您应该一直这样做

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

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

char c=9999;  
9999是一个常量表达式。编译器只需在没有附加上下文的情况下分析声明,就可以确定它将溢出。假定纯字符是有符号的;如果它是无符号的,则转换定义良好,但编译器仍可以选择对此发出警告

char c=9999;
这具有相同的语义,但是对于编译器来说,要警告c的初始化,它必须知道我的值是9999,或者至少在分析该声明时,我的值超出了char的范围。假设你写了:

int i=9999;  

char c=i;
显然,没有必要或适当的警告

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


我会注意到这是对你所问问题的回答:为什么没有警告。你所接受的答案是对一个隐含的问题的回答:我想要一个警告;我如何启用它?。我不是抱怨,只是观察。

:我忘记启用最高警告。感谢这个警告没有考虑i的值恰好是9999这一事实。编译器可能会对int i=42发出相同的警告;char c=i@不,它们都是初始化。你说得对@KeithThompson,谢谢。我删除了错误的评论。@pmg你的评论把我弄糊涂了,我不得不把它放在一个单独的问题里。这是你说的,不是一回事。第一个是任务,第二个是初始化。这是链接@Rüppell's culture:很抱歉。@pmg事实上,像我这样的StackOverflow plebs不会期望像你这样拥有25k+声誉的高手会犯任何错误。.哈哈…+1。pmg也承认关于其中一个是初始化,另一个是作业的评论是错误的。现在整个事情都很清楚了。谢谢你花了这么长时间才想出两个好答案。
int i = 9999;
i = 42;
char c = i;