Под GCC, следующий код всегда возвращает левый операнд <<
если num1s == 0
:сдвиг влево целое 32 бит
0xFFFFFFFFu << (32-num1s);
После прочтения Why doesn't left bit-shift, "<<", for 32-bit integers work as expected when used more than 32 times?, и стандарт цитирует Дэвида Heffernan, кажется, что если левый операнд неподписанный, это определенная операция. Только когда E1 (левый операнд) имеет подписанный тип и неотрицательное значение, это может привести к неопределенному поведению.
Может ли кто-нибудь объяснить, если стандартные состояния явно, что если смещение суммы больше числа бит, которое содержит тип, это неопределенное поведение?
«Поведение не определено, если правый операнд отрицательный или больше или равен длине в битах продвинутого левого операнда». но серьезно, получите себе копию стандарта, эти вопросы тривиальны, чтобы ответить самим. –
Почему это было неопределенное поведение? Он очень определен, и операция приведет к '0'. – YePhIcK
@YePhIcK Он не определен, потому что он определен. –