Oli*_*rth 29
溢出
来自http://en.wikipedia.org/wiki/Arithmetic_overflow:
当计算产生的结果大于给定寄存器或存储位置可以存储或表示的结果时发生的条件.
所以,例如:
uint32_t x = 1UL << 31;
x *= 2; // Overflow!
Run Code Online (Sandbox Code Playgroud)
请注意,正如@R在下面的评论中提到的那样,C标准建议:
涉及无符号操作数的计算永远不会溢出,因为无法通过生成的无符号整数类型表示的结果将以比结果类型可以表示的最大值大1的数量为模.
当然,这是"溢出"的一个相当特殊的定义.大多数人会将模数减少(即环绕)称为"溢出".
潜流
来自http://en.wikipedia.org/wiki/Arithmetic_underflow:
当浮点运算的真实结果的幅度(即,接近于零)小于目标数据类型中可表示为正常浮点数的最小值时,可能发生的计算机程序中的条件.
所以,例如:
float x = 1e-30;
x /= 1e20; // Underflow!
Run Code Online (Sandbox Code Playgroud)
计算机仅使用0和1来表示数据,以便可以表示的值范围受到限制.许多计算机使用32位来存储整数,因此在这种情况下可以存储的最大无符号整数是2 ^ 32 -1 = 4294967295.但是第一位用于表示符号,因此,实际上,最大的值是2 ^ 31 - 1 = 2147483647.
超出允许范围的整数需要的位数多于可存储的位数的情况称为溢出.
类似地,对于实数,指数太小而无法存储会导致下溢.