You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言signed int溢出异常行为:gcc编译优化下的矛盾结果

关于C语言signed int溢出未定义行为的诡异现象

已知C语言中signed int溢出属于未定义行为,原本以为溢出后的结果虽不可预测,但仍属于数值类型。然而以下代码的运行结果却打破了这一认知:

#include<stdio.h>

int main ()
{
    int i,m=-727379968,w=1,n;

    for (i=1;i<=12;i++) 
        w*=10;
    n=w;

    printf("sizeof(int)=%d\n",(int)sizeof(int));
    printf ("m=%d  n=%d  m-n=%d  (1<m)=%d  (1<n)=%d (m==n)=%d \n", m,n, m-n, 1<m, 1<n,m==n);
    return (0);
}

不同编译环境下的输出结果

  • gcc 11.4.0无优化编译,输出符合预期:
sizeof(int)=4
m=-727379968  n=-727379968  m-n=0  (1<m)=0  (1<n)=0 (m==n)=1
  • gcc 11.4.0使用-O2优化编译,出现异常结果:
sizeof(int)=4
m=-727379968  n=-727379968  m-n=0  (1<m)=0  (1<n)=1 (m==n)=0

疑问点

  • 为何会出现1 < n(1小于负数)的情况?
  • 为何m-n=0但m==n的结果为0?
  • 预期赋值n=w后n应为某个int值,但上述结果完全无法理解。

后续测试发现,gcc 14.2.0无论是否开启优化,输出结果均正常:

sizeof(int)=4
m=-727379968  n=-727379968  m-n=0  (1<m)=0  (1<n)=0 (m==n)=1

结论

这是gcc 11.4.0的特殊表现:若认可C标准中signed int溢出属于未定义行为,则该结果不能被视为bug;若认为溢出后变量仍应保持合法数值特性,则可将其看作bug。

内容的提问来源于stack exchange,提问作者Pavel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 17:52:18