无符号整数溢出由C和C++标准很好地定义.例如,C99标准(§6.2.5/9)声明
涉及无符号操作数的计算永远不会过度流动,因为无法用结果无符号整数类型表示的结果将以比结果类型可以表示的最大值大1的数量为模.
但是,这两个标准都声明有符号整数溢出是未定义的行为.再次,从C99标准(§3.4.3/1)
未定义行为的一个示例是整数流上的行为
这种差异是否存在历史或(甚至更好!)技术原因?
由Carl Norum编辑,包括适当的标准参考.
C标准规定
如果在计算表达式期间发生异常情况(即,如果结果未在数学上定义或未在其类型的可表示值范围内),则行为未定义.
是否有编译器开关可以保证整数溢出时的某些行为?我想避免鼻腔恶魔.特别是,我想强制编译器包装溢出.
为了唯一性,让标准为C99,编译器为gcc.但我会对其他编译器(icc,cl)和其他标准(C1x,C89)的答案感兴趣.事实上,只是为了惹恼C/C++人群,我甚至欣赏C++ 0x,C++ 03和C++ 98的答案.
注:国际标准ISO/IEC 10967-1可能与此相关,但据我所知,仅在资料性附录中提到过.
我想使用循环计算 1 到 n 的总和,这是我的 C 代码:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
long sum = 0;
int n = atoi(argv[1]);
for(int i = 1; i<= n; i++)
sum += i;
printf("Sum of serial from 1 to %d = %ld\n", n, sum);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我用小 n 运行程序时,结果是正确的,但当我用大数字运行时,结果是错误的。这是我运行此命令时的结果:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
long sum = 0;
int n = atoi(argv[1]);
for(int i = 1; i<= n; i++)
sum += i;
printf("Sum of …Run Code Online (Sandbox Code Playgroud)