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?