c / c ++ Linksverschiebung ohne Vorzeichen gegen Vorzeichen

Ich habe diesen Code.

#include <iostream>

int main()
{
    unsigned long int i = 1U << 31;
    std::cout << i << std::endl;
    unsigned long int uwantsum = 1 << 31;
    std::cout << uwantsum << std::endl;
    return 0;
}

Es wird ausgedruckt.

2147483648
18446744071562067968

auf Arch Linux 64-Bit, GCC, Ivy Bridge-Architektur.

Das erste Ergebnis macht Sinn, aber ich verstehe nicht, woher die zweite Zahl kommt. 1 dargestellt als 4-Byte-Int vorzeichenbehaftet oder nicht vorzeichenbehaftet ist

00000000000000000000000000000001

Wenn Sie es 31 Mal nach links verschieben, erhalten Sie

10000000000000000000000000000000

Nein? Ich weiß, dass Linksverschiebung für positive Zahlen im Wesentlichen 2 ^ k ist, wobei k angibt, wie oft Sie es verschieben, vorausgesetzt, es passt immer noch in Grenzen. Warum bekomme ich so eine bizarre Nummer?

Antworten auf die Frage(5)

Ihre Antwort auf die Frage