首页  >  文章  >  后端开发  >  为什么在“long long int”赋值中乘以整数文字会导致溢出?

为什么在“long long int”赋值中乘以整数文字会导致溢出?

DDD
DDD原创
2024-11-08 08:28:01399浏览

Why Does Multiplying Integer Literals in a `long long int` Assignment Lead to Overflow?

Long Long Int 赋值中的溢出:为什么整数文字相乘失败

在提供的代码片段中,尝试了三个 long long 整数赋值:

long long int n = 2000*2000*2000*2000; // overflow
long long int n = pow(2000,4); // works
long long int n = 16000000000000; // works

虽然第三个赋值成功,但为什么第一个赋值尽管使用了 long long int 还是会溢出?

理解整数类型

溢出的原因在于整数类型的本质。默认情况下,整数文字被分配可以表示其值的最小类型,但不小于 int。在给定的情况下,2000 是一个 int,在大多数系统上通常占用 32 位。

乘法规则

算术运算符(例如乘法)通过所涉及的两种类型中较大的一个,但不小于 int。例如:

  • char * char 将调用operator*(int,int) -> int
  • char * int 将调用运算符*(int,int) -> int
  • long * int 将调用运算符*(long,long) -> long

但是,int * int 仍然调用operator*(int,int) -> int.

类型提升和溢出

在溢出赋值中,2000*2000*2000*2000 涉及到 4 个 int 值相乘,得到一个比 int 更大的整数可以持有。尽管最终结果存储在 long long int 变量中,但乘法是用整数进行的。

解决溢出

为了避免溢出,可以使用以下方法方法:

  • 显式使用 2000LL,它表示一个 long long int 文字。
  • 使用 pow(2000,4) 以 double 形式执行计算,然后将其分配给 long long int 变量。
  • 直接将大整数值,例如 16000000000000 赋给 long long int 变量。

以上是为什么在“long long int”赋值中乘以整数文字会导致溢出?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn