Go での定数オーバーフローのカスケード
Go で定数を扱う場合、潜在的なオーバーフローを避けるために型変換を理解することが重要です。次のコード スニペットを考えてみましょう:
<code class="go">const ( userid = 12345 did = (userid &^ (0xFFFF << 48)) )</code>
このコードをコンパイルすると次のエラーが発生します:
constant -18446462598732840961 overflows int
この問題を解決するには、Go が実行する基礎となる型変換を詳しく調べる必要があります。
型なし定数と型変換について
上記のコードでは、定数 0xFFFF << 48 は型なし定数です。つまり、特定の型が割り当てられていないことを意味します。型なし定数と型付き値を組み合わせる場合、型なし定数は他のオペランドの型を引き継ぎます。
この場合、型付き定数 userid (int です) の間で AND 演算 (&) を実行しています。 ) および型なし定数 0xFFFF << 48. したがって、結果の式 (userid &^ (0xFFFF <
整数定数のオーバーフロー
問題は、次の場合に発生します。型なし定数 0xFFFF << を否定します。 48、結果は -0xffff000000000001 となります。この値は int 型 (符号付きで -2^31 ~ 2^31-1 の範囲を持つ) には大きすぎるため、コンパイル エラーが発生します。
移植性のために Int64 を使用する
この問題を回避するには、範囲が広く、より大きな定数値を収容できる、int64 などのより大きな整数型を使用できます。
<code class="go">const ( userid int64 = 12345 did = (userid &^ (0xFFFF << 48)) )</code>
この変更により、次のことが可能になります。オーバーフローが発生することなく、利用可能な整数型の制約内で定数を表現および操作できるようになります。
以上が定数を使用すると Go コードでオーバーフロー エラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。