签名整数溢出

int x = INT_MAX + 1;

// x can be anything -> Undefined behavior

如果在评估表达式期间,结果未在数学上定义或未在其类型的可表示值范围内,则行为未定义。

(C++ 11 标准第 5/4 段)

这是一个比较讨厌的问题,因为它通常会产生可重现的,非崩溃的行为,因此开发人员可能会很大程度上依赖于观察到的行为。

另一方面:

unsigned int x = UINT_MAX + 1;

// x is 0

因为:

声明无符号的无符号整数应遵守算术模数 2^n 的定律,其中 n 是该特定整数大小的值表示中的位数。

(C++ 11 标准第 3.9.1 / 4 段)

有时编译器可能会利用未定义的行为并进行优化

signed int x ;
if(x > x + 1)
{
    //do something
}

这里由于没有定义有符号整数溢出,编译器可以自由地假设它可能永远不会发生,因此它可以优化掉 if