私は3バイト配列を変換し、3バイト配列を単一のint32として返さなければならない関数に取り組んでいます。 コードは次のとおりです。 pbDataはバイト配列へのポインタです。最も重要な符号ビット(リント警告)を設定する
const byte bMSBitPosNeg = 0x80;
const byte bMSBNeg = 0xFF;
int32 i32Num = 0;
//Big - Endian
if (pbData != NULL)
{
if ((pbData[0] & bMSBitPosNeg) == bMSBitPosNeg) //Negative
{
i32Num |= (bMSBNeg * 0x1000000); //Force MSB to 0xFF as 3 bytes are
//converted to 4 bytes
}
i32Num |= (pbData[0] << 16);
i32Num |= (pbData[1] << 8);
i32Num |= (pbData[2]);
}
return i32Num;
入力:{0x00,0xBB、0xA3の} 出力:48035 //正数
入力:{0xFFで、0x44,0x5d} 出力:-48035 //負数
コードは期待どおりに動作しますが、私はリント警告を受け取ります。 警告648:操作のための計算定数のオーバーフロー: '乗算'
機能は必要ですが、警告は必要ありません。どのように抑制しますか?
あなたの '0x1000000'定数に' UL'サフィックスを使用してください –
対応するシフトとして乗算を行うと、意味が成り立ちますか?あなたは '** int **'を使って作業していることを覚えておいてください。これは、**署名された** 32ビットタイプです(ほとんどのプラットフォームで)。 –
一般的なヒント:ビットを扱うときは、*常に*明示的に符号なしのデータ型を使用します。 –