0

C# の ulong のような意図的にオーバーフローする構造の性質について、私は多少混乱しています。

基本的に、私は ulong.max X ulong.max の正方形になりたいグリッドに取り組んでいます。座標に対して算術演算を実行すると、グリッドの反対側に自動的にラップされます。ただし、2 つの ulong を掛け合わせてオーバーフローが発生した場合は、そうでない場合の "modulus(ulong.max)" の代わりにゼロになってしまうようです。64 ビットの ulong をオーバーフローさせたときに何が起こるかを誤解しているのかもしれません。

数値を自動的にラップできるグリッドのラップ座標系を作成する方法についてのヘルプは素晴らしいでしょう。多分これは不可能ですか?

「long」を入力して、ビットごとに「ulong」に変換すると、次のような座標になります。

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

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

とにかく、完全にラッピングされた座標グリッドを作成する方法についての指針は役に立ちます。たぶん、私の脳は今日は単に機能していないだけで、ulong の数値が高いと脳が混乱する原因となっている明らかな何かを見逃しているのかもしれません。

4

1 に答える 1

0

ただし、2 つの ulong を掛け合わせてオーバーフローが発生した場合は、そうでない場合の "modulus(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)

18446744073709551615 について考えなければならないよりも、255 + 1 を 0 にラップする方が簡単byteですint。もちろん付きulongです。)

于 2015-02-06T14:51:45.870 に答える