Преобразование знака при ANDing и сравнении

У меня есть следующий код:

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 вызывает это предупреждение. Обе переменные без знака. Есть идеи?

1

Решение

Ваш uint8_tбудет повышен до int прежде чем быть &Вместе Тогда что int сравнивается с x, который до сих пор uint8_t, То же самое происходит с i + HEADER_SIZE, Приведение результатов обратно к uint8_t следует избавиться от предупреждения.

x != uint8_t(a[uint8_t(i + HEADER_SIZE)] & b[i])
1

Другие решения

И то и другое a[i + HEADER_SIZE] а также b[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))
{ // ...
2

Проблема с индексацией, попробуйте:

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

Вы увидите, что проблема в строке _a = … Это потому, что добавление i и HEADER_SIZE вызывает повышение с uint8_t до int.

0
По вопросам рекламы [email protected]