Например, в Си почему второй операнд сдвига может быть подписан?
Примечание. Этот вопрос касается подписи второго операнда операторов сдвига битов << и >>. Совсем не о первом операнде.
CERT INT34-C, частично: не сдвигать отрицательное число битов...
Не то чтобы это нуждалось в оправдании, но они оправдывают, говоря, что это неопределенное поведение.
Я бы подумал, что правило имеет смысл просто потому, что если вы хотите сдвинуть другой путь, сдвиньтесь на положительное число бит, используя соответствующий оператор сдвига для другого направления.
Так что, если в C нет необходимости и нет необходимости сдвигаться на отрицательное число битов, почему второй операнд << или >> вообще может быть подписан?
Например, MISRA-C:2004 (что бы вы ни думали о MISRA, нравится или не нравится) в разделе 6.10.2, в качестве побочного эффекта объяснения того, что тип результата зависит только от первого операнда, говорится, что "второй операнд может быть любого целого типа со знаком или без знака ". [акцент мой]
Зачем приглашать людей использовать подписанный второй операнд в битовом сдвиге? Зачем это разрешать? Предупреждают ли об этом какие-либо компиляторы?
1 ответ
Я не могу сказать, почему все так, как есть... но я рад, что могу перейти на подписанные значения:
3
в выражении a <<= 3;
является инт.
Если сдвиг на int
были незаконны, вам придется сделать a <<= 3U;
,
Недопустимое смещение по знаковым значениям нарушило бы много (я имею в виду много) кода!