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

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

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

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

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

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

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

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

5
задан talkaboutquality 14 April 2011 в 13:17
поделиться