C# 使用溢出但给出正确结果的代码是否可以接受?
我想减去两个用户提供的整数,并存储得到的范围长度。显然,我不能将其存储为整数,例如,减去C# 使用溢出但给出正确结果的代码是否可以接受?,c#,integer-overflow,C#,Integer Overflow,我想减去两个用户提供的整数,并存储得到的范围长度。显然,我不能将其存储为整数,例如,减去int.MaxValue和int.MinValue会使int溢出 我写道: uint rangeLength = (uint)max - (uint)min 它在任何情况下都可以工作,但是您可以看到,当两个整数中的一个为负时,强制转换将返回uint类型。但是,这一行给出了正确的结果 这似乎也是如此,再执行两个操作,但不会溢出: uint rangeLength = ((uint)max + int.MaxV
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);
如果它在任何情况下都有效,那么我认为可读性是你唯一需要担心的事情 您似乎正确地命名了变量-
rangeLength
。你写道它等于max-min
,所以人们可能会理解你在做什么。如果您将结果命名为a
或类似的名称,则结果不好。如果您真的担心,请将其作为一种方法,并抽象出实现细节:
public uint RangeBetween(int max, int min) {
return (uint)max - (uint)min;
}
uint rangeLength = RangeBetween(max, min);
那你为什么不能将它存储为
long
类型呢?实际上你甚至可以将它存储为int
,只是要确保以后正确解释它。uint
和long
是不同的。是的,它是可以的。我在用硬件设计逻辑电路并用c/c应用程序模拟结果时做过很多次。如果您添加了一条评论,这样读者就不会感到困惑,这会有所帮助。你的代码对我来说很有意义,因为我有BSEE。微处理器设计用于处理有符号和无符号数字,在进行数学运算时,溢出的下溢位应该被忽略。@YdobEmos,真的吗?为什么不参考MSDN文档,而不是询问我为什么不能将其存储为long
类型?实际上,您甚至可以将其存储为int
,只需确保稍后正确解释即可。uint
和long
是不同的。是的,可以。我在用硬件设计逻辑电路并用c/c应用程序模拟结果时做过很多次。如果您添加了一条评论,这样读者就不会感到困惑,这会有所帮助。你的代码对我来说很有意义,因为我有BSEE。微处理器设计用于处理有符号和无符号数字,在进行数学运算时,溢出的下溢位应该被忽略。@YdobEmos,真的吗?为什么不参考MSDN文档而不是询问meam,对于OP询问的内容,meam仍然有点困惑。他是在问关于数学运算溢出的问题吗?还是他在寻求建议?问题的最后几句话正是OP想要的,对吗?“在我的代码中使用第一行是可以接受的,还是太混乱了?我是否应该使用第二行,这样看起来就不会出错?”@RahulYes,最后一句是我要问的。我不得不等一等,以便让我接受你的回答。谢谢。我还是有点不明白你在问什么。他是在问关于数学运算溢出的问题吗?还是他在寻求建议?问题的最后几句话正是OP想要的,对吗?“在我的代码中使用第一行是可以接受的,还是太混乱了?我是否应该使用第二行,这样看起来就不会出错?”@RahulYes,最后一句是我要问的。我不得不等一等,以便让我接受你的回答。非常感谢。