ホームページ  >  記事  >  バックエンド開発  >  ビット単位の演算を使用すると Go 定数がオーバーフローするのはなぜですか?

ビット単位の演算を使用すると Go 定数がオーバーフローするのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-01 08:55:30107ブラウズ

Why Does My Go Constant Overflow When Using Bitwise Operations?

Go 定数オーバーフローの問題: Int オーバーフローの解決

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。