13.2.1整数溢出的基本原理

在C语言等语言中,整数溢出对无符号宽度至少为无符号整型;例如。,UINT最大值+1结果为零。这由C标准保证实际上是可移植的,除非您指定具有攻击性,非标准优化选项仅适用于特殊应用。

相反,C标准表示有符号整数溢出会导致程序可以执行任何操作(包括转储)的未定义行为核心或溢出缓冲区。不当行为甚至可以先于溢出。在加法、减法、,乘法、除法和左移位。它甚至可以发生在无符号类型,如无符号短整型更窄的整数,因为这些类型的值被扩大到整数在计算之前。

尽管标准有此要求,但一些C程序仍假定有符号整数溢出无声地环绕模的二次幂,使用two的补码算法,只要转换结果值设置为有符号整数类型。这些程序可能会有问题,尤其是在启用优化时。如果你假设GCC-like编译器,您可以通过使用GCC的-fwrapv公司期权;然而,这不是可移植的。

由于历史原因,C17和更早版本还允许使用1的补码或有符号量算术,但C23要求二的补码,现在假设二是补码是安全的。

此外,将超出范围的值转换为带符号整数类型。这里的标准实现必须定义什么发生,这可能包括引发异常。虽然实用在这种情况下,实现通常会自动循环而是调试实现陷阱。