Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用溢出但给出正确结果的代码是否可以接受?_C#_Integer Overflow - Fatal编程技术网

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,最后一句是我要问的。我不得不等一等,以便让我接受你的回答。非常感谢。