3

次の 2 つの操作は同じです。ただし、MaxValues1 は、「チェック モードでのコンパイル時に操作がオーバーフローする」ため、コンパイルされません。MaxValues2 のようにハードコードされた値を使用せずに、コンパイラで何が起こっているのか、どのように回避できるのか説明してもらえますか?

public const ulong MaxValues1 = 0xFFFF * 0xFFFF * 0xFFFF;

public const ulong MaxValues2 = 0xFFFD0002FFFF;
4

4 に答える 4

4

符号なしリテラルを取得するには、u接尾辞を追加し、それらを長いl接尾辞にします。つまり、あなたが必要ulです。

オーバーフロー動作が本当に必要な場合は、uncheckedget に追加できますunchecked(0xFFFF * 0xFFFF * 0xFFFF)が、それはおそらくあなたが望むものではありません. リテラルが として解釈されInt32、 ではなく として解釈されulong0xFFFF * 0xFFFF * 0xFFFF約 2^48 であるため 32 ビット整数に適合しないため、オーバーフローが発生します。

public const ulong MaxValues1 = 0xFFFFul * 0xFFFFul * 0xFFFFul;
于 2012-04-05T00:19:58.970 に答える
2

デフォルトでは、整数リテラルの型はintです。「UL」サフィックスを追加して、それらをulongリテラルに変更できます。

public const ulong MaxValues1 = 0xFFFFUL * 0xFFFFUL * 0xFFFFUL;

public const ulong MaxValues2 = 0xFFFD0002FFFFUL;
于 2012-04-05T00:21:22.360 に答える
1

各数値に数値サフィックス「UL」を追加します。それ以外の場合、C# はそれらを Int32 と見なします。

C# - 数値サフィックス

于 2012-04-05T00:21:37.487 に答える
1

ulong最後に割り当てるまで、実際にはそうではないと思います。試してみてください

public const ulong MaxValues1 = (ulong)0xFFFF * (ulong)0xFFFF * (ulong)0xFFFF;

つまり、MaxValues13 つの 32 ビット int を乗算していて、結果が別の 32 ビット int として暗示されるため、オーバーフローします。op をキャストすると、3 を乗算するように変更さulongsれますが、結果がulong

(ulong)0xFFFF * 0xFFFF * 0xFFFF;

0xFFFF * (ulong)0xFFFF * 0xFFFF;

また、結果の型は最大の型に基づいて計算されるため、機能します

しかし

0xFFFF * 0xFFFF * (ulong)0xFFFF;

最初の2つはintをオーバーフローするため、機能しません

于 2012-04-05T00:20:13.180 に答える