Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.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语言中的数字溢出包装#_C# - Fatal编程技术网

C# C语言中的数字溢出包装#

C# C语言中的数字溢出包装#,c#,C#,我需要用C#做一种夹钳。 当一个数字达到最大值时,它返回到零,当它达到最小值时,它返回到最大值。 我需要这样做,因为我想平铺纹理。你到底在哪里遇到问题 这似乎很直截了当: int number = 4; int maxNum = 20; int minNum = 5; number = number > maxNum ? 0 : number < minNum ? maxNum : number; // 20 int number=4;int maxNum=20;int minNu

我需要用C#做一种夹钳。 当一个数字达到最大值时,它返回到零,当它达到最小值时,它返回到最大值。
我需要这样做,因为我想平铺纹理。

你到底在哪里遇到问题

这似乎很直截了当:

int number = 4; int maxNum = 20; int minNum = 5;
number = number > maxNum ? 0 : number < minNum ? maxNum : number;
// 20
int number=4;int maxNum=20;int minNum=5;
数字=数字>最大值?0:number

您需要的是模运算符(稍微调整以按照您想要的方式处理负数)

模是你的朋友:

myVal = (myVal++) % (maxValue+1);
例如,如果最大值为4,则:

0 % 5 = 0
1 % 5 = 1
2 % 5 = 2
3 % 5 = 3
4 % 5 = 4
5 % 5 = 0
6 % 5 = 1
....

好,找到解决方案

private float Wrap(float val, float min, float max)
    {
        val = val - (float)Math.Round((val - min) / (max - min)) * (max - min);
        if (val < 0)
            val = val + max - min;
        return val;
    }
专用浮点换行(浮点值、浮点最小值、浮点最大值)
{
val=val-(float)数学四舍五入((val-min)/(max-min))*(max-min);
if(val<0)
val=val+max-min;
返回val;
}

能给我们一些您正在编写的代码吗?确定如何以最佳方式实现这一目标可能很有用。无论如何您可以将这些钳制数字保留在私有成员中,并使用属性对其进行修改,以便您还可以检查它们是否达到最大值,并最终将其设置回0。您尝试过什么吗?请阅读,这是我的问题:@GiulioZausa根本无法描述您的问题(与此问题相关的术语)。对不起,当我使用钳形获得纹理的坐标时,我只重复最后一个像素,而不是整个纹理,因此我不需要钳形,而需要包裹。DirectX可以做到这一点,但我需要用GDI+来做到。这只有在每次递增/递减一个值时才有效。如果你比最大值高出5,那么你将在0处结束,而不是在5处,这通常是“包装”语义所期望的。谢谢,但这是一个简单的夹具,我需要一种类似磁带计数器的“返回”:当数字大于它返回的最大值时zero@GiulioZausa:也许我对钳子不太熟悉。请注意,我已经编辑了答案,如果值大于最大值,则返回0。这适用于添加值,但不适用于减法。如果低于0,则不会换行到顶部。我想您会发现,要正常工作,此表达式必须为:myVal=(++myVal)%(maxValue+1);只有当输入大于除数时才有效。@MattBurland是的,这是一种常见的情况。修改以涵盖一般情况。同样值得注意的是,这将从
0
换行到
除数-1
。因此,您的最大值将比除数小一个。@MattBurland这取决于最大值是包含边界还是独占边界。OP将其描述为:“当它达到最大值时”,而不是“当它超过最大值时”,这意味着它是独占的。在这两种情况下,如果OP希望除数加1,那么除数加1当然是一种选择。很公平,只是觉得值得注意,以防其他人看到它,并且不清楚限制是包含的还是独占的。1)如果你在之前的值上加了多个1,则这不会正确包装;最大+5应该是5,而不是0。2) 你根本无法处理低于0的问题。谢谢你!我在修!1) 你甚至在打while循环之前就把max设置为零,这会把你搞砸的。这和
if
都应该消失。2) 您的
while
应该具有
=
而不是
,才能将其索引为零。3) 您基本上实现了一个效率低下的等效模数
%
%
操作符将更短、更清晰、运行更快。4) 你仍然没有处理负数。
0 % 5 = 0
1 % 5 = 1
2 % 5 = 2
3 % 5 = 3
4 % 5 = 4
5 % 5 = 0
6 % 5 = 1
....
private float Wrap(float val, float min, float max)
    {
        val = val - (float)Math.Round((val - min) / (max - min)) * (max - min);
        if (val < 0)
            val = val + max - min;
        return val;
    }