使用带有算术运算符的变量包装

Wrapping ulong variables with arithmatic operators

我对 C# 中 ulong 等故意溢出结构的性质感到有些困惑。

本质上,我正在处理一个我想成为 ulong.max X ulong.max 正方形的网格。如果我对坐标执行算术运算,我希望它自动覆盖网格的另一侧。但是,似乎如果我将两个 ulong 相乘并导致溢出,我最终会得到零而不是 "modulus(ulong.max)" 否则我会得到什么。也许我误解了当我溢出 64 位 ulong 时应该发生什么。

任何关于如何为允许数字自动环绕的网格创建环绕坐标系的帮助都会很棒。也许这是不可能的?

我输入 "longs" 并将它们按位转换为 "ulongs",最终得到的坐标如下:

(-1,0) = (0xFFFFFFFF, 0x00000000)

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

无论如何,任何有关制作完全环绕坐标网格的方法的指示都会有所帮助。也许我的大脑今天根本不工作,我遗漏了一些明显的东西,这导致它在高 ulong 数字下变得混乱。

However, it seems if I multiply two ulongs together and it results in an overflow, I end up with zero instead of the "modulus(ulong.max)" of whatever I would have otherwise.

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

例如:

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

基本上,wrap-around 的工作原理与您预期的完全一样。

我建议使用 byte 作为更简单的例子。例如:

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

比起必须考虑 18446744073709551615,更容易想到 255 + 1 换行到 0。但从根本上说,它们的行为方式相同(转换后 - 否则“byte 算术”实际上是在升级到 int 之后执行 - 当然 ulong 不会发生这种情况。)