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
相关产品推荐
相关产品推荐

