2015-02-06 80 views
0

对于像C#中的ulong这样的有意溢出结构的本质,我有些困惑。使用算术运算符包装ulong变量

本质上我正在做一个网格,我想成为ulong.max X ulong.max方块。如果我在坐标上执行算术运算,我希望它自动换行到网格的另一侧。然而,看起来如果我将两个ulpon放在一起并导致溢出,那么我最终会得到零,而不是我所拥有的任何“模数(ulong.max)”。也许我误解了当我溢出64位ulong时会发生什么。

任何关于如何为网格创建包装坐标系统的帮助,允许数字自动回绕会很好。也许这是不可能的?

我喂养在 “多头” 和将它们转换为 “ulongs” 逐位与像坐标结束:

(-1,0)=(0xFFFFFFFF的,00000000)

(-2 ,0)=(0xFFFFFFFE,0x00000000)

无论如何,任何关于如何构建完全包装坐标网格的指针都会有所帮助。也许我的大脑根本不在今天工作,我错过了一些显而易见的事情,导致它在高倍数上失效。

回答

0

但是,看起来如果我将两个ulpon放在一起并且导致溢出,那么我最终会得到零而不是我所拥有的“模数(ulong.max)”。

你不会得到结果modulus(ulong.max) - 你会得到结果modulus(ulong.max + 1)

例如:

ulong x = 10000000000L; 
ulong y = 2000000000L; 
Console.WriteLine(x * y); // 1553255926290448384 

基本上环绕作品完全一样,你应该指望它。

虽然我会推荐使用byte作为简单的例子。例如:

byte x = 150; 
byte y = 2; 
byte z = (byte) (x * y); // 44 (300 % 256) 

它很容易想到的255 + 1包装内,以0比它要想一想18446744073709551615.但从根本上讲,他们的行为以同样的方式(铸造后 - 否则“byte算术”是实际上是在升级到int之后执行的 - 当然,这与ulong不会发生。)

+0

由于某种原因,我的perlin生成器只是在long已被转换(按位)为ulong之后拖动任何坐标“0以下”。 – ThisHandleNotInUse 2015-02-06 14:53:45

+0

@ThisHandleNotInUse:我不知道任何“perlin生成器”,但如果你的代码不符合你的期望,它会很方便将其视为一个简短但完整的计划。 – 2015-02-06 14:54:53

+0

这就像300线,所以我没有发布它,因为它是为特定用途修改的perlin生成器。我不知道该怎么定位我的错误 - 我制作的最后一个发生器将它封装在一个更小的间隔中,这样做并没有什么大不了的,因为这些数字从来没有试图将自己扩展为“溢出”/环绕。 – ThisHandleNotInUse 2015-02-06 15:09:20