java - 关于 Java 溢出的困惑

标签 java c++ c

我有以下声明:

long result = a * b * c;

这会导致变量结果溢出。也是如此:

long result = (long)a * b * c;

但是当分解时,它们不会:

long result = a;
result *= b;
result *= c;

a和b的类型是int

谁能解释一下为什么会这样?在前两种情况下,Java 是否会将中间结果存储在一个临时的内部 int 变量中?

C 和 C++ 的行为方式也一样吗?

最佳答案

假设 a * b * c 适合 long,但 a * b 不适合 int-

  • 您的第一个代码段会溢出,因为 a * b 进入临时 int,正如您所怀疑的那样。
  • 您的第二个代码段不会像您声称的那样出现溢出,因为它在每个点乘以 long 值。
  • 您的第三个代码段没有溢出,因为它还在每个点乘以 long 值。

而且,是的,C 和 C++ 也都以这种方式工作;尽管根据平台的不同,intlong 的长度可能不同。

关于java - 关于 Java 溢出的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19483580/

相关文章:

c - 使用 Malloc() 使用指针创建整数数组

java - 在 GridBagLayout 中对齐 JTextField

java - BSAF 停止打开数据库连接

c++ - 从 QT 中的 Q_PROPERTY 序列化嵌套的用户定义类

c - 寻找组织单向火车站交通的算法中的错误

c - 如何使用文本文件的内容(制表符分隔格式)来重命名文件夹中的文件?

Java TCP 在同一个套接字上的客户端和服务器端之间发送和接收多条消息

java - 将 Csv 文件写入类似矩阵的结构

c++ - 有没有办法检查迭代器是否在C++中的IF语句中是random_access?

c++ - Swig + tcl + c++(内存管理)