ao deslocar bytes, existem alguns cenários que parecem não fazer sentido, por exemplo
printf("shifted bytes %llx\n",(((long long)1 << 63 ))>>1);
saídas c0000000000000000, isso não acontece com long longs sem sinal ou se o deslocamento inicial para a esquerda for menor que 63. No entanto, como 1 é armazenado como 000000000000001 em long longs com sinal e sem sinal e apenas operações bit a bit são executadas, não parece haver qualquer razão para a diferença, como algo assim pode acontecer?
Você está deslocando um valor assinado para o bit de sinal. Mais formalmente, o resultado do deslocamento está fora do intervalo de valores que a
long long
pode armazenar.Neste caso em particular, o resultado matemático de
1<<63
é 2 63 , e along long
(assumindo 64 bits) tem um intervalo de -2 63 a 2 63 -1, então o resultado está fora do intervalo. Isso dispara um comportamento indefinido no seu código.Isso é descrito na seção 6.5.8p2 do padrão C em relação ao operador de deslocamento à esquerda: