保持有符号整数溢出未定义的目的可能是编译器优化。但其最初原因是标准没有定义有符号整数的位表示法。不同的实现提供了不同的有符号整数表示法,它们的溢出特性也会不同。这只是因为标准没有定义这些溢出特性而被允许。相比之下,无符号整数位表示法始终是明确定义的(否则,你无法有效地进行大量的按位操作),因此它们的溢出行为也可以被明确定义。对于特定大小的无符号整数的逻辑运算,在该值表示法下,以最大无符号值+1为模运算。因此,标准有一种方法可以说明任何数学运算的结果:它是预期的数值结果模最大无符号值+1。也就是说,如果你有一个16位无符号整数,它持有65535,并且你将1加到它上面,数值结果是65536。然而,在16位数字中得到的结果是0。这是标准定义的方式,因为这是特定位深度的布尔运算的工作方式。表示法定义了行为。相比之下,不同的有符号整数形式具有不同的溢出特性。如果标准定义了16位有符号整数32767 + 1的特定含义,那么如果特定的有符号整数表示法没有自然地提供该答案,编译器将不得不更改如何将这些值相加以生成该答案。对于补码,此添加结果为-0。如果标准使其成为实际行为,则每个二进制补码实现都无法仅仅添加数字。它必须检查溢出并掩盖结果。在每个数学运算中。1是其他原因,例如大多数代码无法很好地定义它。也就是说,在有符号整数溢出的情况下,大多数代码如果被很好地定义,将会一样失败。