Naw*_*waz 15 c++ gcc warnings overflow integer-overflow
在下面的程序中,第5行确实提供了 预期的溢出警告,但令人惊讶的是,第4行在GCC中没有给出任何警告:http://www.ideone.com/U0BXn
int main()
{
int i = 256;
char c1 = i; //line 4
char c2 = 256; //line 5
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我在想这两行应该给出溢出警告.还是有什么我想念的?
导致我做这个实验的主题是:typedef类型检查?
在那里我说了以下(我从我的答案中删除了,因为当我运行它时,它没有像我预期的那样出现):
//However, you'll get warning for this case:
typedef int T1;
typedef char T2;
T1 x = 256;
T2 y = x; //possible overflow warning! (but it doesn't give warning :()
Run Code Online (Sandbox Code Playgroud)
Edw*_*nge 12
-Wall不包括很多选项. -Wconversion是其中之一,并警告你感兴趣的行为.
请参阅http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
在int为char对象赋值的一般情况下,编译器不知道它是否int超出范围char.
更仔细地看一下实际警告:
warning: overflow in implicit constant conversion
Run Code Online (Sandbox Code Playgroud)
在这种特定情况下,常量被转换为char编译器能够发出警告的情况.同样,如果您将声明更改i为const:
const int i = 256;
Run Code Online (Sandbox Code Playgroud)
您还将收到警告,因为分配给的值c2是一个常量表达式.
另请注意,警告有些误导,因为转换在技术上并不"溢出".算术溢出在C++中产生未定义的行为.收缩转换(像int到char,如果int具有更大的范围比char)产生一些实现定义的转换.