Например, в Си почему второй операнд сдвига может быть подписан? - PullRequest
5 голосов
/ 14 апреля 2011

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

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

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

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

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

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

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

1 Ответ

4 голосов
/ 14 апреля 2011

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

3 в выражении a <<= 3; - это целое число.
Если бы смещение на int было недопустимым, вам нужно было бы сделать a <<= 3U;.

Делать недопустимым смещение по знаковым значениям было бы очень сложно (я имею в виду A LOT ) кода!

...