表达式的结果在数学上没有定义
C++-Undefined-Behavior-29
如除 0、有符号整数溢出、负数位运算、浮点异常等均会导致未定义的行为。
示例:
signed s = INT_MAX + 1; // Undefined
unsigned u = UINT_MAX + 1; // Well-defined
例中变量 u 的值一定是 0,而 s 的值是标准未定义的,往往由编译器和执行环境决定。
设无符号整数的最大值为 M,无符号整数运算在程序中的结果是数学上的结果与 (M + 1) 取模的结果,这在数学上是有明确定义的,而对于有符号整数,将符号位移出相关比特位,或将非符号位移入符号位,在数学上是没有意义的,故称无符号整数不存在溢出问题,有符号整数存在溢出问题,溢出会导致未定义的行为。
依据
ISO/IEC 14882:2003 5(5)-undefined
ISO/IEC 14882:2011 5(4)-undefined