gpt4 book ai didi

java - 如何修复整数溢出产生的错误数字?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:26:20 25 4
gpt4 key购买 nike

我有一个导致整数溢出的错误,导致错误(负)时间戳被写入数据库。 代码 已经修复,但我也想修复错误的数据

我想,我可以只取错误的结果并添加 Integer.MAX_VALUE,但这似乎不起作用,它让我得到了很高的值。我在下面的代码片段中有 offset 值,但未存储输入值。

以下代码重现了该错误:

@Test
public void testArexxConversion()
{
// The input values represent seconds since midnight, Jan 1, 2000 UTC
final int sample = 361450072; // A sample input value drawn from production
// I use the offset from the UNIX epoch to convert the vakue to UNIX seconds
final int offset = 946684800; // midnight, Jan 01 2000 UTC in UNIX seconds
// This was the buggy line in my code, the assertion will fail
long result = (sample + offset) * 1000;
// Prints 'Result is negative: -1830153280'
Assert.assertTrue(result > 0, String.format("Result is negative: %d", result));
// This is for comparison
Date dt = new Date(offset * 1000);
Assert.assertEquals(dt.getTime() + sample * 1000, result);
}

最佳答案

如何修复数据库中的错误

要修复数据库中的错误,您可以对所有错误数据执行以下添加操作:

long new_result = old_buggy_result + 1309965025280L;

常量是这样找到的:

  1. 检查错误的 result
  2. 找出正确的 result 值应该是多少?
  3. 对错误的 result 值进行加法运算以找到正确的“结果”。

但这只有在您将 sampleoffset 保存在您的数据库或其他地方时才有可能。

否则,它取决于原始计算期间发生的环绕次数:

long size_of_int = (long)Math.pow(2, 32);
int number_of_wraps = 305 // Only correct in your example!
// You can't deduct the number of wraps from
// the wrong value alone, because that information
// is lost in the modulo (the "wrap")
long correct_number = wrong_number + size_of_int * number_of_wraps;

如果您数据库中的数字足够接近您的样本值,这意味着,您可以执行上述操作,使用 305 作为换行数。

错误的解释(给 future 的读者)

这里的操作:

 (sample + offset) * 1000;

是使用 int 而不是 long 计算的。但结果“太大”,无法保存在 int 变量中。这就是你溢出的原因。

将其更改为:

  ((long) sample + offset) * 1000L;

所以现在 +* 操作将使用 long 值完成,结果将是一个 long 不会溢出的值。

关于java - 如何修复整数溢出产生的错误数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6356854/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com