大家知道,因为寄存器和内存单元容量有限,数值不可能无限大。语言标准规定数值溢出可能是未定义的行为。一种常见的说法是,有符号数才有溢出的概念,无符号数没有溢出的概念,只有回绕。
- C语言无符号整型溢出会回绕,有符号整型溢出行为不确定。
一般而言,编译器的实现会遵循汇编指令溢出的状态或者按照特定常规计算算法,例如计算一个十进制整型字符串的数值,会按位累加乘10, 最终的数值即为溢出的值。 - PHP超出整数范围的数值会自动转换成浮点数以保证数值正确。
检测溢出
- 以int加法为例,不能单纯用a + b > INT_MAX来检测,因为a + b很可能已经是负数。常见的检查方法是检查EFLAGS b'11 OF位是否为1.