Если побитовые операторы ~ и <<будут применены к операнду с базовым типом символьного или короткого целого без знака без знака, результат должен быть сразу брошен к базовому типу операнда
Если побитовые операторы ~ и <<будут применены к операнду с базовым типом символьного или короткого целого без знака без знака, результат должен быть сразу брошен к базовому типу операнда.
Когда побитовые операторы ~
и <<
применяются к маленьким целочисленным типам, таким как короткое целое без знака и char без знака, операциям предшествует интегральное продвижение. Таким образом, маленькие целочисленные типы сначала продвинуты на больший целочисленный тип, и затем операция происходит. Результат их битовая операция может содержать неожиданные биты высшего порядка. Например:
uint8_t var = 0x5aU; uint8_t result = (~var)>>4;
var
0101 1010
и тот из ~var
1010 0101
. Вы можете ожидать тот result
0000 1010
. Поскольку var
продвинут на большее целое число перед ~var
вычисляется, результат становится 1111 1010
. Биты высшего порядка могут быть неожиданными. Результаты таких операций могут зависеть от размера int
в вашей реализации.Чтобы избежать беспорядка и неожиданных ошибок, бросьте результат поразрядного ~
и >>
операторы назад к базовому типу операндов перед использованием результатов. Например:
uint8_t var = 0x5aU; uint8_t result = (static_cat<unit8_t>(~var))>>4;
result
в этом случае 0000 1010
, который является ожидаемым значением.Как исключение, не требуется кастинг, если вы применяете эти побитовые операторы на типы короткого целого, и затем сразу присваиваете результат объекту того же базового типа. Например, значением результата в этом случае является 0000 1010
не требуя броска.
uint8_t var = 0x5aU; unit8_t result = ~var; // No higher order bits // due to implicit conversion uint8_t result = results>>4;
Polyspace® отмечает использование поразрядного ~
и >>
операторы, если все эти условия верны:
Операторы используются на unsigned short
или unsigned char
операнд.
Результат операции сразу не присвоен объекту, который имеет тот же базовый тип как операнд.
Результат используется, не будучи брошенным к базовому типу операнда.
Если вы ожидаете нарушение правила, но не видите его, относитесь, чтобы Диагностировать, Почему Кодирующие Стандартные Нарушения Не Появляются как ожидалось.
Группа: Выражения |
Категория: необходимый |