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

Is it acceptable to use code that overflows but gives the correct result?

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

我写了这个:

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

它在每种情况下都有效,但您可以看到,当两个整数之一为负数时,转换将溢出 uint 类型。但是,这一行给出了正确的结果。

这好像是一样的,多做了两次操作,但是没有溢出:

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

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

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

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

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

uint rangeLength = RangeBetween(max, min);