15

これはばかげた質問のように感じますが、答えが見えないようです。私はUInt64を持っていますが、これは最大値が

UInt64.MaxValue 18446744073709551615

ただし、適度なサイズの数値を割り当てようとすると、「チェックモードでコンパイル時に操作がオーバーフローします」というオーバーフローエラーが発生します。「チェックされていない」ブロックでラップすると、コンパイルされ、この変数がゼロであるかのように実行されます。

UInt64 value1 = 1073741824 * 8; // Compile error CS0220
UInt64 value2 = 8589934592;     // Actual value - no error

なぜこれが起こっているのですか?

4

3 に答える 3

29

なぜなら:

UInt64 value1 = 1073741824 * 8;

符号付き 32 ビット整数として演算を行ってからulong. 試す:

UInt64 value1 = 1073741824UL * 8;

UL、リテラルが unsigned long であることを意味します。リテラル サフィックスの詳細については、C# 仕様のセクション 2.4.4 を参照してください。

リテラルの末尾に UL、Ul、uL、ul、LU、Lu、lU、または lu が付いている場合は、ulong 型です。

于 2012-04-15T23:54:42.883 に答える
4

1073741824ではintなく、UInt64です。
したがって、乗算は 32 ビット符号付き整数の制限を超えています。

ulいずれかのオペランドに (unsigned long) サフィックスを追加します。

于 2012-04-15T23:54:51.307 に答える
1

1073741824intの代わりに操作しているため、エラーが発生します(の最大値は2147483647です)。したがって、最初のケースでは、タイプ のオーバーフローが発生します。 最初の式を次のように変更します。 longintint
int

UInt64 value1 = 1073741824L * 8;

そして問題は消えます。

于 2012-04-15T23:59:19.710 に答える