Примечание: этот вопрос связан с подписью второго операндом операторов сдвига бит < < и >>. Совсем не о первом операнде.В C, например, почему второй операнд сдвига разрешен для подписания?
CERT INT34-C, в частности: Не переключайте отрицательное число битов ...
Не то, что ей необходимо оправдание, но они оправдывают говорят, что это undefined behavior.
Я бы подумал, что правило имеет смысл просто потому, что если вы хотите сдвинуть другой путь, сдвиньте на положительное число бит, используя соответствующий оператор сдвига для другого направления.
Так что, если в C нет необходимости и не определено смещение на отрицательное количество бит, почему второй операнд < < или >> даже разрешено подписываться?
MISRA-C: 2004, например (что бы вы ни думали о MISRA, вроде или не нравится) в его разделе 6.10.2, как побочный эффект объяснения того, что тип результата зависит только от первого операнда, говорит что «второй операнд может быть любого подписан или беззнаковый целочисленный тип». [emphasis mine]
Зачем приглашать людей использовать подписанный второй операнд в сдвиге бит? Зачем это позволить? Предупреждают ли какие-либо компиляторы об этом?
Допускается формально подписанный тип. Нельзя отрицать. Также не допускается превышать число бит в типе. Означает ли это, что C должно требовать использования битовых типов в 5 бит в качестве правого операнда для сдвигов по 32-битовому целому? Конечно, это было бы чушь. Если вам не нужен язык, который «приглашает» вас делать глупые вещи, вы, вероятно, должны начать искать другой язык. Но другие языки «приглашают» вас делать разные глупые вещи (например, конкатенация строк); вам будет сложно найти «идеальный» ... –
@R истинно, что я не могу найти идеальный язык, но есть разница между двумя требованиями по второму операнду сдвига бит: неотрицательный требование может быть принудительно введено с помощью объявленного (и не литого) типа операнда, тогда как требование не слишком большого размера требует фактического изучения значения операнда. – talkaboutquality