两个 int 相乘得到负数

2023-12-10

我目前正在编写一个小下载管理器,当我尝试以百分比计算下载进度时,我得到了一个有趣的输出。这就是我用来计算的:

int progress = (byte_counter * 100) / size;
System.out.println("("+byte_counter+" * 100) = "+(byte_counter * 100)
  +" / "+size+" = "+progress);

byte-counter是一个 int (它计算从InputStream) and size是下载文件的长度(以字节为单位)。

这对于小下载量非常有效。但是当我处理更大的文件(40MB)时,它开始产生有趣的事情。计算的输出如下所示:

[...]
(21473280 * 100) = 2147328000 / 47659008 = 45
(21474720 * 100) = 2147472000 / 47659008 = 45
(21476160 * 100) = -2147351296 / 47659008 = -45
(21477600 * 100) = -2147207296 / 47659008 = -45
[...]

I don't know why, but the calculation gets negative. Since an normal Integer should be fine with numbers till 231-1, this shouldn't be the problems root. But what am I missing?


See http://en.wikipedia.org/wiki/Arithmetic_overflow

要在 java 中修复,请尝试使用long反而。

int progress = (int) ((byte_counter * 100L) / size);

或相反的操作顺序

int progress = (int) (((float) byte_counter) / size) * 100);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

两个 int 相乘得到负数 的相关文章

随机推荐

  • MDbg - 调试器的协议与被调试者不兼容

    我正在使用 MDbg 检索进程的应用程序域中列出的所有程序集的列表 每当我尝试将进程附加到 MDbgEngine 时 我都会收到以下异常消息 调试器的协议与被调试者不兼容 HRESULT 异常 0x8013134B 我是否遗漏了某些内容或错
  • 如何将 pdf 文件转换为 CSV 文件?

    我想将 PDF 文件转换为 CSV 文件 我为此使用 iText 库 该程序运行良好 但输出不是所需的格式 所有数据都位于 csv 文件的第一行 输出应该与 pdf 文件完全相同 意味着带有换行符 请帮忙 提前致谢 Document doc
  • 通过图形 API 获取所有用户及其上次登录信息

    我正在尝试导出所有用户数据 包括上次登录日期 我正在关注这篇文章 https morgantechspace com 2021 09 find last login date for all azure ad users using pow
  • 将派生类型与过程从模块放置到子模块

    我需要一些有关使用子模块的帮助 我的目的是使用一个子模块来表示来自父模块的特定派生类型 并且我想将派生类型的整个声明放入子模块中 例如 这是我想要转换的示例代码 MODULE PARENT MODULE IMPLICIT NONE TYPE
  • 如何知道给定的DLL是否被给定的进程加载? [复制]

    这个问题在这里已经有答案了 可能的重复 如何以编程方式获取 DLL 依赖项 在 Windows 上 在 C 程序中 我想知道给定的 DLL 我知道路径 是否由给定的外部进程 我知道 exe 的路径 使用 win32 函数加载 必须能够列出进
  • ObjectContext.GetObjectType(e.GetType()) 不返回 POCO 实体的实体类型

    The ObjectContext GetObjectType 方法应该返回 与指定类型的代理对象关联的 POCO 实体的实体类型 那么为什么在我的代码中它只返回代理呢 我正在使用实体框架 6 候选版本 Soft delete var e
  • 如何使在网络 A 框架中动态生成的实体可点击?

    我正在使用网络 A 框架在加载页面时生成一个新实体 我想在这些实体上添加一些功能 例如悬停 单击等 我尝试使其可单击 但没有成功 function rigClick console log Entity Clicked
  • 访问 PHP 函数中的全局变量

    根据大多数编程语言的作用域规则 我可以访问在函数内部定义的变量 但为什么这段代码不起作用 输出是 为了解决所提出的问题 它不起作用 因为您需要声明将在函数本身中访问哪些全局变量 data My data function menugen g
  • Python 中的 Selenium 单元测试——我的日志文件在哪里?

    因此 我将一些单元测试从 Selenium IDE 导出到 Python 现在我正在尝试调试一些东西 我注意到 Selenium 使用logging模块 有一个特定的行selenium webdriver remote remote con
  • Firefox 中的隐藏滚动条(允许滚动但没有滚动条)

    我想创建一个能够滚动但不显示滚动条的 div 我已经找到了 Webkit 的解决方案 如下 但是如何在其他浏览器中完成此操作 我宁愿避免使用 JavaScript 插件 希望找到 CSS 或供应商特定的解决方案 网络套件解决方案 photo
  • fseeko,fseeko64; ftello、ftello64 Visual C 等效项

    有人可以帮助我告诉我 fseeko 的 Visual C 等价物是什么吗 fseeko64 ftello ftello64 谢谢 没有返回 使用 off t 的函数 如果您需要 64 位位置 可以使用 fseeki64 ftelli64
  • 在Java中解析“2010年1月10日”格式的日期? (使用序数指标,st|nd|rd|th)

    我需要用Java解析 2010年1月10日 格式的日期 我怎样才能做到这一点 如何处理序数指标 the st nd rd or th跟踪天数 这有效 String s January 10th 2010 DateFormat dateFor
  • 查找对象的所有属性和子属性

    有时我想知道一个对象是否具有我正在寻找的属性 但有时一个对象有很多属性 可能需要一些时间才能找到它并进行调试 如果我可以编写一个函数来查找字符串中的所有属性及其值 那么我可以将该字符串粘贴到记事本中 并使用记事本具有的查找功能查找我正在查找
  • 如何解压Google AppEngine批量下载器编写的sqlite3数据库

    我需要下载应用程序数据存储区中相当大 多 GB 实体的所有实例 我有足够的磁盘空间来存储实体的数据 但不足以存储批量下载程序作为 SQLite 数据库检索的原始数据and下载程序在应用我的bulkloader yaml 文件中指定的转换后写
  • android_build.sh 在构建 ffmpeg 库时出错

    我正在尝试构建 ffmpeg 库 下面给出了我的 android build sh bin bash NDK C Users Benzatine Downloads android ndk r10e SYSROOT NDK platform
  • KDB:在两个列表中应用二元函数

    考虑一个函数F x y 生成一个表 我还有两个清单 xList x1 x2 x3 and yList y1 y2 y3 进行简单逗号连接的最佳方法是什么F x1 y1 F x1 y2 F x1 y3 F x2 y1 从而产生一张大桌子 您已
  • 错误“函数参数太少”

    我在以下代码片段中遇到错误 Too few arguments to function showtbl GetTabellen ns 0 passed in abcde folder php php on line 153 and exac
  • C# 中是否有像 Java 中那样的 splitByCharacterType 方法?

    Java中有一个方法按字符类型分割例如 需要一个字符串0015j8 并将其分成 0015 j 8 c 中有这样的内置函数吗 如果不是 我将如何构建一个函数来执行此操作 public static IEnumerable
  • ror 中使用 Paperclip 进行多次上传

    我正在使用回形针上传一栋建筑物的一张照片 http www youtube com watch v KGmsaXhIdjc我已经用这种方法做到了 但我决定将多张照片上传到一栋建筑 我可以使用回形针来做到这一点还是必须更改它并使用 jQuer
  • 两个 int 相乘得到负数

    我目前正在编写一个小下载管理器 当我尝试以百分比计算下载进度时 我得到了一个有趣的输出 这就是我用来计算的 int progress byte counter 100 size System out println byte counter