Betrachten Sie das folgende Stück Code:Warum gibt 1ul << 64 1 anstelle von 0 zurück?
// Simply loop over until 64 is hit.
unsigned long x = 0;
for (int i = 0; i <= 64; i++) {
if (i == 64) {
x = 1ul << i;
printf("x: %d\n", x);
}
}
Wir wissen, dass unsigned long ist 64 Bit breit und links 1 um 64 Positionen Verschiebung würde 1000 ... 000 (64 Nullen hinter einer) werden, und würde jedoch hat auf 0 abgeschnitten worden ist, gibt den tatsächlichen Ausdruck:
x: 1
das merkwürdige ist, wenn wir nur
printf("x: %d\n", (1ul << 64));
tun würde, es druckt 0
Kann jemand erklären, warum das passiert? Warum erzeugt das Programm im ersten Fall fälschlicherweise 1 statt 0, aber im zweiten Fall ist es richtig?
Warum Schleife 64 mal? Warum nicht einfach "i" gleich 64 setzen? –
Um zu beginnen, verwenden Sie das falsche Format, um einen 'unsigned long'-Wert zu drucken. Sie sollten "% lu" 'verwenden. Siehe z.B. [Diese 'printf'- (und Familien-) Referenz] (http://en.cppreference.com/w/c/io/fprintf). –
@JonnyHenly Wenn ich nur "int i = 64" mache und die Verschiebung und den Druck mache, gibt es 0. Ist das nicht magisch? – OneZero