使用溢出但得到正确结果的代码是否可以接受?

时间:2017-06-24 20:04:04

标签: c# integer-overflow

我想减去两个用户提供的整数,并存储结果范围长度。我显然无法将其存储为整数,例如减去int.MaxValueint.MinValue会溢出一个int。

我写了这个:

uint rangeLength = (uint)max - (uint)min

它适用于所有情况,但是当两个整数中的一个为负数时,您可以看到强制转换为uint类型。但是,这一行给出了正确的结果。

这似乎做了同样的事情,再做两次操作,但没有溢出:

uint rangeLength = ((uint)max + int.MaxValue) - ((uint)min + int.MaxValue);

在我的代码中使用它的第一行是否可以接受,还是太混乱了?我应该使用第二个,以免它看起来像是错误吗?

1 个答案:

答案 0 :(得分:2)

如果它适用于所有情况,那么我认为可读性是您唯一需要担心的事情。

您似乎已正确命名变量 - rangeLength。你写道它等于max - min,所以人们可能会理解你在做什么。如果您将结果命名为a或类似的东西,那就不好了。如果您真的很担心,请将其作为一种方法并抽象出实施细节:

public uint RangeBetween(int max, int min) {
    return (uint)max - (uint)min;
}

uint rangeLength = RangeBetween(max, min);