Go プログラミングの領域では、「userid := 12345 のときに定数がオーバーフローするのはなぜですか」というよくある質問が生じます。 := (userid &^(0xFFFF << 48))?"
このようなコードをコンパイルすると、「constant -18446462598732840961 overflows int.」という恐ろしいエラーが表示されます。しかし、この誤解を招くメッセージの根底には何があるのでしょうか?
この問題の背後にある犯人は、定数 ^(0xFFFF << 48) の型指定されていない性質です。 Go は、型なしの定数に、従来の整数の範囲を超える巨大な値を割り当てます。
0xffff
48 は 0xffff000000000000 を返します。ビット単位の否定演算子 (^) を使用して符号を反転すると、-0xffff000000000001 になります。これで、変数 userid は値 12345 で初期化され、int 型を継承します。ビット単位の AND 演算 (&) が実行されると、コンパイラーは型なし定数を int 型にダウングレードする必要があると想定します。この仮定は、定数の大きさが int に許容される最大値を超えるため、衝突を引き起こします。解決策: 型付けされていない巨人を飼いならすこの問題を解決するには、型キャストの力を活用してください。 。定数 0x0000ffffffffffff を割り当てる場合は、1真の移植性を実現するには、int を避けてください。 int64 の拡張により、コードの範囲が広がり、32 ビットと 64 ビットの両方のアーキテクチャに対応できるようになります。以上がビット単位の演算を使用すると Go 定数がオーバーフローするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。