"Использование знакового целочисленного операнда с двоичным побитовым оператором" - при использовании короткого замыкания без знака

В следующем фрагменте кода C, который проверяет, установлены ли первые два бита 16-разрядной последовательности:

bool is_pointer(unsigned short int sequence) {
  return (sequence >> 14) == 3;
}

CLion Clang-Tidy дает мне предупреждение "Использование знакового целочисленного операнда с двоичным побитовым оператором", и я не могу понять, почему. Является ли unsigned short недостаточно неподписанным?

Ответы

Ответ 1

Код для этой проверки, кажется, заботится, если какой-либо операнд для побитового оператора подписан. Это не sequence вызывающая предупреждение, а 14, и вы можете смягчить проблему, сделав 14 без знака, добавив в конце букву " u.

(sequence >> 14u)

Ответ 2

Я думаю, что целая реклама вызывает здесь предупреждение. Операнды, меньшие, чем int, расширяются до целого числа для арифметического выражения, которое подписано. Таким образом, ваш код эффективно return ( (int)sequence >> 14)==3; что привело к предупреждению. Попробуйте return ( (unsigned)sequence >> 14)==3; или return (sequence & 0xC000)==0xC000; ,