android中原始数据类型的值限制

时间:2012-05-01 05:47:20

标签: java android long-integer

在我的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)/持续时间);

2 个答案:

答案 0 :(得分:4)

如我的评论中所述,您从中获取信息的帖子完全不正确。 long总是64位。 NIO可能存在一些限制,但这是另一回事。

但是,您可以轻松解释您的问题。这是你的代码:

position = (bufferSize * currentPosition) / duration;

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

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

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

根据你的缓冲区大小,你应该计算出currentPosition这个范围可以达到的范围 - 我希望它适用于任何合理大小的文件长度和缓冲区大小组合,说实话

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

答案 1 :(得分:0)

就像@Jon Skeet一样,我觉得很长就够了。但是在长度不够大的情况下,您可以考虑将bufferSize分配一千或一百万。你会失去一些精度,但结果仍然接近你正在寻找的东西:你会以千字节或兆字节而不是以字节为单位来估算你的缓冲区“丰满度”。