В C побитовая операция сдвига влево вызывает Undefined Поведение, когда левый операнд имеет отрицательное значение.
Соответствующая цитата из ISO C99 (6.5.7/4)
Результат E1 < E2 - левые сдвинутые позиции E2; освобожденные биты заполняются нулями. Если E1 имеет неподписанный тип, значение результата равно E1 × 2 E2 уменьшенному по модулю один больше максимального значения, представляемого в типе результата. Если E1 имеет подписанный тип и неотрицательное значение, а E1 × 2 E2 представим в типе результата, то это полученное значение; в противном случае поведение не определено.
Но в С++ поведение корректно определено.
ISO С++ - 03 (5.8/2)
Значение E1 < E2 - E1 (интерпретируется как битовый шаблон), сдвинутые слева позиции E2; освобожденные биты заполняются нулями. Если E1 имеет неподписанный тип, значение результата E1 умножается на величину 2, поднятую до мощности E2, уменьшенную по модулю ULONG_MAX + 1, если E1 имеет тип unsigned long, UINT_MAX + 1 в противном случае. [Примечание: константы ULONG_MAX и UINT_MAXare определены в заголовке). ]
Это означает
int a = -1, b=2, c;
c= a << b ;
вызывает Undefined Поведение в C, но поведение хорошо определено в С++.
Что заставило комитет ISO С++ учесть, что поведение хорошо определено в отличие от поведения в C?
С другой стороны, поведение implementation defined
для операции побитового правого сдвига, когда левый операнд отрицательный, справа?
Мой вопрос в том, почему операция сдвига влево вызывает Undefined Behavior in C и почему оператор shift shift вызывает только поведение, определенное реализацией?
P.S: Пожалуйста, не давайте ответов, например "Это поведение Undefined, потому что стандарт говорит так".: P