mudança de bits com o tipo longo sem sinal produz resultados incorretos

Estou um pouco confuso porque queria inicializar uma variável do tipounsigned long cujo tamanho é de 8 bytes no meu sistema (em todos os sistemas modernos, suponho). Quando eu quero atribuir1 << 63 para a variável, no entanto, recebo um aviso do compilador e o número é de fato 0. Quando faço isso1 << 30 Eu recebo o resultado esperado de2 ^ 30 = 1073741824. No entanto, quando eu faço1 << 31, Eu recebo o resultado de2 ^ 64 (Eu acho; na verdade isso não deveria ser possível) que imprime18446744071562067968.

Alguém pode me explicar esse comportamento?

questionAnswers(4)

yourAnswerToTheQuestion