ここでのいくつかの回答int
は、anの幅が16ビットの場合、0xFFFF
負であると述べています。本当じゃない。 0xFFFF
決して負ではありません。
16進リテラルは、それを含むのに十分な大きさの次のタイプの最初のもので表されます: int
、、、、および。unsigned int
long
unsigned long
int
の幅が16ビットの場合、はで0xFFFF
表現できる最大値よりも大きくなりますint
。したがって、0xFFFF
はタイプunsigned int
であり、を表すのに十分な大きさであることが保証されています0xFFFF
。
の評価のために通常の算術変換が実行されると&
、unsigned int
はに変換されlong
ます。16ビットで表現できるすべての値は32ビットでも表現できるため、16ビットunsigned int
からへの変換はlong
明確に定義されています。 unsigned int
long
初期型は符号なしであるため、符号拡張は必要ありません。0xFFFF
使用した結果は、を使用した結果と同じ0xFFFFL
です。
または、int
が16ビットより広い場合0xFFFF
は、タイプint
です。これは署名されていますが、正の数です。この場合、両方のオペランドが符号付きでありlong
、変換ランクが高いため、通常の算術変換によってint
再びに昇格されます。long
他の人が言っているように、数値結果は符号付きの表現方法に依存するため、符号付きオペランドに対してビット単位の演算を実行することは避けてください。
それを除けば、このコードには特に問題はありません。宣言されたときに初期化されないのはスタイルの問題だと私は主張しvalue
ますが、それはおそらくちょっとしたレベルのコメントであり、//some stuff
省略されたセクションの内容に依存します。
uint32_t
移植性を高めるために、代わりに固定幅の整数型(のような)を使用することもおそらく望ましいlong
ですが、実際には、それもあなたが書いているコードとあなたの基本的な仮定に依存します。