【问题标题】:Value limits of primitive data types in androidandroid中原始数据类型的值限制
【发布时间】:2012-05-01 05:47:19
【问题描述】:

在我的 android 应用程序(音频处理)中,我使用 long 类型变量来计算它被暂停的位置,但是对于大型音频文件,该应用程序给了我奇怪的结果。经过一番努力,我发现位置计算超出了 android 的限制。虽然 java 中的 long 类型的最小值为 -9,223,372,036,854,775,808,最大值为 9,223,372,036,854,775,807,但我想知道为什么我的计算超出了限制。

在经历了一些posts 之后,我发现android 支持有限的值范围,不像java。但我的问题是如何在 android 中执行此计算?是否有任何其他 android 特定的数据类型?

这是我在我的应用程序中执行的计算: 位置=((bufferSize*currentPosition)/duration);

【问题讨论】:

  • 该帖子中接受的答案是完全错误的。自己尝试一下 - 你会发现long 绝对可以使用到极限。

标签: java android long-integer


【解决方案1】:

正如我在评论中指出的,您从中获取信息的帖子完全不正确。 long 始终为 64 位。 NIO 可能有一些限制,但那是另一回事。

但是,您的问题可以很容易地得到解释,无需任何技巧。这是你的代码:

position = (bufferSize * currentPosition) / duration;

您还没有说bufferSizecurrentPosition 的类型是什么,但我假设它们是long。如果你有一个非常大的缓冲区和一个“迟到的”currentPosition 值,那么乘法的结果可能会溢出成负数。当您将该负数除以 duration 时,您仍然会得到一个负数(但幅度较小)。

如果bufferSizecurrentPositionint 变量而不是long,则溢出会更快发生。确实,如果是这种情况,那么您很可能只需通过强制以 64 位完成算术来解决您的问题:

position = ((long)bufferSize * currentPosition) / duration;

您应该根据您的缓冲区大小计算出currentPosition 的最大范围 - 老实说,我希望它适用于任何合理大小的文件长度和缓冲区大小组合。

如果这没有帮助,请发布更多信息 - 包括变量类型和您正在观察的值(对于所有变量,包括结果)。

【讨论】:

  • bufferSize、currentPosition和duration都是int类型。
  • 正如你上面所说,位置 = ((long)bufferSize * currentPosition) / 持续时间,它仍然给出不同的值。
  • @user1219456:我猜你的意思是int? (没有像 integer 这样的类型。)如果是这样,那么这很有意义 - 你的乘法正在打破 2^31 的障碍并溢出。
  • @user1219456:“不同的价值”?这种模糊的描述很难给你任何帮助。请发布所有变量的值,以及您预期的结果。
  • bufferize= 535680, current= 9527, duration= 33000 计算的位置是 24480。预期值是 154649
【解决方案2】:

就像@Jon Skeet 一样,我想很长的时间就足够了。但在 long 不够大的情况下,您可以考虑将您的 bufferSize 除以一千或一百万。您会失去一些精度,但结果仍会接近您正在寻找的结果:您将以千字节或兆字节为单位来近似缓冲区“充满度”,而不是以字节为单位。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-21
    • 1970-01-01
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    相关资源
    最近更新 更多