コードは次のとおりです。
*(buf+2) |= (unsigned char)(mFlag & 0x7f);
buf
ありunsigned char *
、mFlag
ありunsigned char
の戻り値がoperator|=
警告を受け取るためだと思います
警告: 'int' から 'unsigned char' への変換により、その値が変更される可能性があります
警告を削除するにはどうすればよいですか? によるものoperator|=
ですか?
C では、すべての演算 ( を含む&
) は、少なくとも と同じ幅の型で行われますint
。したがって、式の結果は、定数の型に応じて常にint
orになります。unsigned
定数0x7f
は明らかにコンパイラが与えるどの文字型の範囲内にもあるため、実際にはあまり役に立たないので、バグだとさえ思います。
これについてあなたができる唯一のことは、
*(buf+2) = (unsigned)*(buf+2) | 0x7FU;
つまり、値を明示的により広いタイプに変換します。それでも割り当てられた使用に関する警告が表示される場合
*(buf+2) = (unsigned char)((unsigned)*(buf+2) | 0x7FU);
ただし、コンパイラをアップグレードするか、使用する警告オプションを変更することを決定的に検討する必要があります。
定数を符号なしとして宣言することにより、警告が発生した場合は取り除くことができるはずです
*(buf+2) |= (mFlag & 0x7fu);
警告を削除するには、値を保持するための一時変数が明らかに必要0x7f
です。
unsigned char x = 0x7f;
*(buf+2) |= mFlag & x;
問題は、コンパイラがリテラルをunsigned char
キャスト結果を介して警告に変換しようとする試みを処理しているようです (さらに議論すると、これは|=
演算子に固有のものであり、単純な割り当てには問題がないようです)。ただし、変数の初期化は警告なしで許可されます。
別の回避策は、キャストと同じ目的を果たすインライン関数を定義することです。この関数を C++ に似たものにしましたstatic_cast<>
。
template <typename T>
inline T static_conversion (T x) { return x; }
//...
*(buf+2) |= mFlag & static_conversion<unsigned char>(0x7f);
C にはテンプレートがないため、AC バージョン (C++ でも機能します) は別のインライン関数を使用します。
inline unsigned char to_unsigned_char (unsigned char x) { return x; }
/* ... */
*(buf+2) |= mFlag & to_unsigned_char(0x7f);
@chrisが言うように、おそらくマスキングの結果をキャストしています(-Wconversion
フラグがオンの場合は警告が表示されます)
私は使用します*(buf+2) = (unsigned char)((mFlag & 0x7f) | *(buf+2));
が、使用を主張する場合|=
は、複合リテラルを利用できます (C99 のみ):
*(buf+2) |= (unsigned char){mFlag & 0x7f};