为什么 200020002000*2000 会导致 C 溢出
赋值 20002000 的值时2000*2000 到 long long 变量,发生溢出。但是,使用 pow(2000,4) 或直接将 16000000000000 分配给 long long int 不会导致溢出。
溢出原因
整数文字 2000默认情况下隐式转换为 int 类型,通常为 32 位。算术运算符总是将参数提升为现有类型中较大的一个,但不能小于 int。因此,在这种情况下,乘法以 int*int 的形式执行,从而产生 int 结果。
溢出与非溢出场景
在第二种场景中,其中使用 pow(2000,4) 时,pow 函数将参数提升为 double 并返回 double 值。这样可以确保计算过程中不会发生溢出。
在第三种场景中,16000000000000 直接分配给 long long int,字面量足够大,可以隐式转换为 long long。因此,执行分配不会出现问题。
解决方案
为了防止第一个场景中的溢出,您应该使用 LL 后缀将整数文字显式转换为 long long:
long long n = 2000LL*2000LL*2000LL*2000LL;
以上是为什么 200020002000 * 2000 在 C 中会导致溢出,但 pow(2000, 4) 或直接赋值不会导致溢出?的详细内容。更多信息请关注PHP中文网其他相关文章!