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