1

次のコードがあります。

const uint8_t HEADER_SIZE = 0x08;
std::vector<uint8_t> a, b;
uint8_t x;

/* populate 'a', 'b'. Set 'x' */

for ( uint8_t i = 0; i < HEADER_SIZE; ++i )
{
    // The if statement (specifically the AND): Conversion to 'unsigned int' from 'int' may change the sign of the result [-Wsign-conversion]
    if ( x != ( a[i + HEADER_SIZE] & b[i] ) )
    {
         /* ... */
         break;
    }
}

ほとんどすべてをキャストしようとしましたが、単純な AND がこの警告を引き起こしている理由を理解できないようです。どちらの変数も符号なしです。何か案は?

4

3 に答える 3

2

a[i + HEADER_SIZE]との両方が asb[i]に昇格されます。intどちらも符号なしの型ですが、 より狭い型ですint。すべてのより狭い整数型が昇格されますint(昇格されるint型のすべての値を表すことができる場合)、またはunsigned intすべての組み込み算術演算に昇格されます。

すべてのオペランドを明示的に に変換するとunsigned int、警告が消えます。

unsigned int a_dash = a[i + HEADER_+SIZE];
unsigned int b_dash = b[i];
unsigned int x_dash = x;
if (x_dash != (a_dash & b_dash))
{ // ...
于 2012-10-01T15:02:56.330 に答える
1

あなたの は、一緒に教育される前に にuint8_t昇進します。次に、それは と比較されますが、これはまだです。で同じことが起こります。結果をキャストすると、警告が取り除かれます。int&intxuint8_ti + HEADER_SIZEuint8_t

x != uint8_t(a[uint8_t(i + HEADER_SIZE)] & b[i])
于 2012-10-01T15:02:13.067 に答える
0

問題はインデックス付けにあります。試してください:

_a = a[i + HEADER_SIZE];
_b = b[i];
if ( x != (_a & _b) )

問題が _a = ... 行にあることがわかります。これは、i と HEADER_SIZE を追加すると、uint8_t から int に昇格するためです。

于 2012-10-01T14:59:55.277 に答える