警告:隐式常量转换溢出

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


Jam*_*lis 9

intchar对象赋值的一般情况下,编译器不知道它是否int超出范围char.

更仔细地看一下实际警告:

warning: overflow in implicit constant conversion
Run Code Online (Sandbox Code Playgroud)

在这种特定情况下,常量被转换为char编译器能够发出警告的情况.同样,如果您将声明更改iconst:

const int i = 256;
Run Code Online (Sandbox Code Playgroud)

您还将收到警告,因为分配给的值c2是一个常量表达式.

另请注意,警告有些误导,因为转换在技术上并不"溢出".算术溢出在C++中产生未定义的行为.收缩转换(像intchar,如果int具有更大的范围比char)产生一些实现定义的转换.

  • 但是如果我们将`int`分配给`char`,编译器应该发出警告,因为可能会丢失数据! (2认同)