在我的Android应用程序(音频处理)中,我使用长类型变量来计算它被暂停的位置,但应用程序给了我大型音频文件的奇怪结果。经过一番努力后,我发现位置计算超出了android的限制。虽然java中的long类型的最小值为-9,223,372,036,854,775,808,最大值为9,223,372,036,854,775,807,但我想知道为什么我的计算超出限制。
经过一些posts后,我发现android支持的限制值范围与java不同。但我的问题是如何在Android中执行此计算?是否还有其他特定于Android的数据类型?
这是我在我的应用中执行的计算: 位置=((BUFFERSIZE * currentPosition)/持续时间);
答案 0 :(得分:4)
如我的评论中所述,您从中获取信息的帖子完全不正确。 long
总是64位。 NIO可能存在一些限制,但这是另一回事。
但是,您可以轻松解释您的问题。这是你的代码:
position = (bufferSize * currentPosition) / duration;
您尚未说出bufferSize
和currentPosition
的类型,但我认为它们是long
。如果你有一个非常大的缓冲区和一个“迟”currentPosition
值,则乘法的结果可能会溢出为负数。当您将该负数除以duration
时,您仍会得到负数(但幅度较小)。
如果bufferSize
和currentPosition
是int
个变量而不是long
,那么溢出会更快发生。实际上,如果是这种情况,那么你可以通过强制算术以64位完成来解决你的问题:
position = ((long)bufferSize * currentPosition) / duration;
根据你的缓冲区大小,你应该计算出currentPosition
这个范围可以达到的范围 - 我希望它适用于任何合理大小的文件长度和缓冲区大小组合,说实话
如果这没有帮助,请发布更多信息 - 包括变量类型和您正在观察的值(对于所有变量,包括结果)。
答案 1 :(得分:0)
就像@Jon Skeet一样,我觉得很长就够了。但是在长度不够大的情况下,您可以考虑将bufferSize分配一千或一百万。你会失去一些精度,但结果仍然接近你正在寻找的东西:你会以千字节或兆字节而不是以字节为单位来估算你的缓冲区“丰满度”。