0

我对 C# 中像 ulong 这样的故意溢出结构的性质有些困惑。

本质上,我正在研究一个我想成为 ulong.max X ulong.max 正方形的网格。如果我对坐标执行算术运算,我希望它自动环绕网格的另一侧。但是,似乎如果我将两个 ulong 相乘并导致溢出,我最终会得到零,而不是其他情况下的“模数(ulong.max)”。也许我误解了当我溢出 64 位 ulong 时应该发生什么。

任何有关为网格制作环绕坐标系以允许数字自动环绕的方法的帮助都会很棒。也许这是不可能的?

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

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

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

无论如何,有关制作完全环绕坐标网格的方法的任何指针都会有所帮助。也许我的大脑今天根本不工作,我错过了一些明显的东西,导致它在高 ulong 数字时失控。

4

1 回答 1

0

但是,似乎如果我将两个 ulong 相乘并导致溢出,我最终会得到零,而不是其他情况下的“模数(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当然。)

于 2015-02-06T14:51:45.870 回答