签名整数溢出
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
块