在我的机器中,整数数据类型的大小是4个字节,因此正方向的最大值是2147483647,而对于有符号的int,负方向的最大值是-2147483648。考虑下面的c程序
#include<stdio.h>
int main(void)
{
int a = 2147483648;
int b = -2147483649;
printf("%d",a);
printf("\n%d",b);
return 0;
}
输出:-2147483647 2147483647
为什么a隐式转换为-2147483648而b隐式转换为2147483647?为什么我只得到第2行以下给出的警告
“隐式常量转换溢出(-woverflow)”
您想要的警告在QCC由-pedantic
启用。在代码块中,转到设置,编译器并找到“启用严格ISO C要求的警告”。打开它。
在您的情况下发生的是整数溢出,这会导致未定义的行为。
来自C委员会草案(N1570)
3.4.3 1未定义的行为 在使用不可移植或错误的程序结构或错误数据时,本国际标准不对其施加任何要求。 2注意:可能的未定义行为范围包括完全忽略不可预测结果的情况,在转换或程序执行期间以环境特征(有或没有发出诊断消息)的文档方式执行,终止翻译或执行(发布诊断信息)。 3示例:未定义行为的示例是整数溢出时的行为。