【问题标题】:overflow issues in implict conversions?隐式转换中的溢出问题?
【发布时间】:2018-09-12 01:09:18
【问题描述】:

在我的机器中,整数数据类型的大小是 4 个字节,所以在有符号整数的情况下,正侧的最大值是 2147483647,负侧的最大值是 -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)”

【问题讨论】:

  • 这可以通过了解 2 的补码编码的工作原理来解释。 stackoverflow.com/questions/1049722/what-is-2s-complement
  • 有符号整数的上溢和下溢未定义。
  • 1.整数溢出是未定义的行为。您不应该期望从这些分配中获得一致的结果。 2. 你的结果 1&2 对我来说似乎很直观(如果我要定义所需的行为,那就是它的样子)。不过,我不确定丢失的警告。这似乎不受欢迎 :)
  • @zzyzx 此代码中没有 UB。如果在相同的实现上重新运行代码,您应该期望得到一致的结果。

标签: c


【解决方案1】:

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

【讨论】:

  • C 编译器在警告方面认为“迂腐”让我抓狂。
【解决方案2】:

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

来自 C 委员会草案 (N1570)

3.4.3
1 未定义的行为
行为,在使用不可移植或错误的程序构造或错误数据时, 本国际标准对此没有要求。
2 注意:可能的未定义行为的范围从完全忽略具有不可预测结果的情况,到在翻译或程序执行期间以环境特征的记录方式表现(有或没有发出诊断消息),终止翻译或执行(发出诊断消息)。
3 示例:未定义行为的一个示例是整数溢出行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-02
    • 2012-01-02
    • 1970-01-01
    • 2019-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多