理解 C 算术中的 Long Long 整数溢出
考虑以下代码片段:
long long int n = 2000 * 2000 * 2000 * 2000; // overflow
为什么会这样尽管声明了一个 long long 变量来保存结果,代码还是导致溢出?
溢出的原因
问题在于整数文字的类型常量 2000。默认情况下,整数文字被分配可以保存其值但不小于 int 的最小类型。由于 2000 可以存储在 32 位 int 中,因此对这些文字的算术运算将作为 int 运算执行。
类型提升
虽然像 n 这样的 long long 变量可以如果存储较大的值,则使用乘法运算中存在的较大类型来调用算术运算符。然而,在这种情况下,无论目标类型如何,较大的类型仍然是 int。
溢出的含义
这意味着乘法的结果 2000 * 2000 * 2000 * 2000 被计算为 32 位整数,会溢出,因为结果超出了 int 可以容纳的最大值。
替代方法
避免这种情况溢出,您可以使用文字常量的 LL 后缀或显式转换运算符 (long long) 将整数文字显式转换为 long long:
long long int n = (long long)2000 * 2000 * 2000 * 2000; // no overflow
或者,您可以使用 pow 函数来计算结果,确保使用 long long 值执行计算:
long long int n = pow(2000, 4); // no overflow
通过显式转换或使用 pow 函数,可以确保使用 long long 值执行计算,防止溢出。
以上是为什么即使使用“long long”变量,整数文字相乘也会导致溢出?的详细内容。更多信息请关注PHP中文网其他相关文章!