У меня есть следующий код:
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 вызывает это предупреждение. Обе переменные без знака. Есть идеи?
Ваш uint8_t
будет повышен до int
прежде чем быть &
Вместе Тогда что int
сравнивается с x
, который до сих пор uint8_t
, То же самое происходит с i + HEADER_SIZE
, Приведение результатов обратно к uint8_t
следует избавиться от предупреждения.
x != uint8_t(a[uint8_t(i + HEADER_SIZE)] & b[i])
И то и другое 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))
{ // ...
Проблема с индексацией, попробуйте:
_a = a[i + HEADER_SIZE];
_b = b[i];
if ( x != (_a & _b) )
Вы увидите, что проблема в строке _a = … Это потому, что добавление i и HEADER_SIZE вызывает повышение с uint8_t до int.