使用溢出但给出正确结果的代码是否可以接受?
Is it acceptable to use code that overflows but gives the correct result?
我想减去两个用户提供的整数,并存储结果范围长度。我显然不能将它存储为整数,例如减去 int.MaxValue
和 int.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);
我想减去两个用户提供的整数,并存储结果范围长度。我显然不能将它存储为整数,例如减去 int.MaxValue
和 int.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);