Например, в Си почему второй операнд сдвига может быть подписан?

Примечание. Этот вопрос касается подписи второго операнда операторов сдвига битов << и >>. Совсем не о первом операнде.

CERT INT34-C, частично: не сдвигать отрицательное число битов...

Не то чтобы это нуждалось в оправдании, но они оправдывают, говоря, что это неопределенное поведение.

Я бы подумал, что правило имеет смысл просто потому, что если вы хотите сдвинуть другой путь, сдвиньтесь на положительное число бит, используя соответствующий оператор сдвига для другого направления.

Так что, если в C нет необходимости и нет необходимости сдвигаться на отрицательное число битов, почему второй операнд << или >> вообще может быть подписан?

Например, MISRA-C:2004 (что бы вы ни думали о MISRA, нравится или не нравится) в разделе 6.10.2, в качестве побочного эффекта объяснения того, что тип результата зависит только от первого операнда, говорится, что "второй операнд может быть любого целого типа со знаком или без знака ". [акцент мой]

Зачем приглашать людей использовать подписанный второй операнд в битовом сдвиге? Зачем это разрешать? Предупреждают ли об этом какие-либо компиляторы?

1 ответ

Я не могу сказать, почему все так, как есть... но я рад, что могу перейти на подписанные значения:

3 в выражении a <<= 3; является инт.
Если сдвиг на int были незаконны, вам придется сделать a <<= 3U;,

Недопустимое смещение по знаковым значениям нарушило бы много (я имею в виду много) кода!

Другие вопросы по тегам