Связанных с previous question, я не могу понять некоторые правила MISRA C 2004Использование небольшого целого с оператором бит в C
В ISO C99 draft 2007, в 6.5 раздела § 4:
Некоторых операторов (унарный оператор ~, а бинарные операторы < <, >>, &,^и |, совместно описываемые как побитовые операторы), должны иметь операнды с целым типом. Эти операторы дают значения, которые зависят от внутренних представлений целых чисел, и имеют определенные для реализации и неопределенные аспекты для подписанных типов.
ОК, используя целое число со знаком с побитовыми операторами, может производить неопределенное поведение (и не имеет смысла).
Хорошим решением является использование явного преобразования в более широкий беззнаковый целочисленный тип, чтобы обходить интегральную рекламу, а затем не использовать знаковое значение с побитовыми операторами (см. Связанные ответы моего предыдущего вопроса).
Но в MISRA C 2004 возможно использование небольших целых без знака с побитовыми операторами (например, правило 10.5). Почему, если интегральное продвижение приводит к использованию подписанных значений с побитовыми операторами? Думаю, я не понимаю некоторых вещей.
Я не уверен, что понял вопрос, но это не имеет значения, если беззнаковое значение повышен до большего типа. Положительные числа и беззнаковые числа, меньшие, чем максимальное значащее значение, выглядят одинаково, т. Е. Знаковый бит равен 0. – Caleb
Беззнаковые целочисленные типы не приведут к подписанию int из-за интегральной рекламы. например unsigned short всегда будет беззнаковым int и никогда не будет подписанным int. – mch
@mch Не верно для систем, где short и int имеют разный размер. Если unsigned short может помещаться внутри 'int', он будет передан в' int', который будет подписан. – Lundin