有符号整数溢出:如果在一个'int'类型(比如)上的算术溢出,其结果是未定义的。一个例子是"INT_MAX+1"不保证是INT_MIN。这个行为启动了对某些代码是重要的某种类型的优化。例如,知道INT_MAX+1是未定义的,允许把"X+1 > X"优化为"true"。知道乘法“不会”溢出(因为这样做将是未定义的)允许把"X*2/2"优化为"X"。尽管这些可能看起来微不足道,这些事情通常通过内联及宏展开展露。这允许的一个更重要的优化是对像这样的"<="循环:
for (i = 0; i <= N; ++i) { ... }
在这个循环中,编译器可以假定该循环将实际迭代N+1次,如果"i"对溢出是未定义的,这允许各种循环优化的介入。另一方面,如果该变量被定义为对溢出回绕,那么编译器必须假定该循环可能是无限的(如果N是INT_MAX,这会发生)——这会禁止这些重要的循环优化。这特别地影响64位平台,因为如此多的代码使用"int"作为索引变量。
值得注意的是,无符号溢出被保证定义为2的补码溢出(回绕),因此你总是可以使用它们。使得有符号整数溢出有定义的代价是,失去这些类型的优化(例如,一个常见的症候是在64位平台上的循环中有大量的有符号扩展)。Clang与GCC都接受"-fwrapv"标记,它强制编译器把有符号整数溢出处理作有定义(除了INT_MIN除以-1)。
------------------------------------------------引自http://blog.