隐式转换中的溢出问题?

问题描述 投票:-3回答:2

在我的机器中,整数数据类型的大小是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)”

c
2个回答
1
投票

您想要的警告在QCC由-pedantic启用。在代码块中,转到设置,编译器并找到“启用严格ISO C要求的警告”。打开它。


0
投票

在您的情况下发生的是整数溢出,这会导致未定义的行为。

来自C委员会草案(N1570)

3.4.3 1未定义的行为 在使用不可移植或错误的程序结构或错误数据时,本国际标准不对其施加任何要求。 2注意:可能的未定义行为范围包括完全忽略不可预测结果的情况,在转换或程序执行期间以环境特征(有或没有发出诊断消息)的文档方式执行,终止翻译或执行(发布诊断信息)。 3示例:未定义行为的示例是整数溢出时的行为。

© www.soinside.com 2019 - 2024. All rights reserved.