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