Por que a operação de deslocamento à esquerda invoca o Comportamento indefinido quando o operando do lado esquerdo tem valor negativo?
Em C, a operação de deslocamento à esquerda em bits chama o comportamento indefinido quando o operando do lado esquerdo tem valor negativo.
Citações relevantes da ISO C99 (6.5.7 / 4)
O resultado de E1 << E2 são as posições de bit E2 com deslocamento à esquerda E1; os bits desocupados são preenchidos com zeros. Se E1 tiver um tipo não assinado, o valor do resultado será E1 × 2E2, módulo reduzido um a mais que o valor máximo representável no tipo de resultado. Se E1 tiver um tipo assinado e um valor não negativo, e E1 × 2E2 é representável no tipo de resultado, então esse é o valor resultante; de outra forma,o comportamento é indefinido.
Mas em C ++ o comportamento é bem definido.
ISO C ++ - 03 (5.8 / 2)
O valor de E1 << E2 é E1 (interpretado como um padrão de bits) posições de bits E2 deslocadas à esquerda; bits desocupados são preenchidos com zero. Se E1 tiver um tipo não assinado, o valor do resultado será E1 multiplicado pela quantidade 2 elevada à potência E2, módulo reduzido ULONG_MAX + 1 se E1 tiver um tipo não assinado por muito tempo, UINT_MAX + 1 caso contrário. [Nota: as constantes ULONG_MAX e UINT_MAX são definidas no cabeçalho). ]
Que significa
int a = -1, b=2, c;
c= a << b ;
chama comportamento indefinido em C, mas o comportamento está bem definido em C ++.
O que forçou o comitê ISO C ++ a considerar esse comportamento bem definido em oposição ao comportamento em C?
Por outro lado, o comportamento éimplementation defined
para operação de deslocamento à direita bit a bit quando o operando esquerdo é negativo, certo?
Minha pergunta é por que a operação de deslocamento à esquerda invoca o Comportamento indefinido em C e por que o operador de deslocamento à direita invoca apenas o comportamento definido pela implementação?
P.S: Por favor, não dê respostas como "É um comportamento indefinido porque o Padrão diz isso". : P