为什么在将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的回答所指出的那样,一个足够聪明的编译器可以警告这两种情况,如果它对程序执行期间将要发生的事情进行额外的分析。 对于某些编译器,它有助于实现优化,因为优化代码所需的分析(不破坏它)也可以揭示这种潜在的运行时错误。
我会注意到这是你问的问题的答案:为什么没有警告。 您接受的答案是隐含的问题:“我想在这里发出警告;我该如何启用它?”。 我不是在抱怨,只是观察。