該程序的每行輸出等於2^i
-2,除了最後一行,等於2^64-1。爲什麼?爲什麼我需要從1 << 64減去2以得到2^64-1?
#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
int main(void) {
unsigned long long ONE = 1;
unsigned long long i;
for (i = 1; i <= 64; i++) {
printf("%"PRIu64"\n", (ONE << i) - 2);
}
return EXIT_SUCCESS;
}
輸出:
0
2
6
14
30
62
126
254
510
1022
2046
...
4611686018427387902
9223372036854775806
18446744073709551615
我非常確定移動64位導致未定義的行爲。你是否嘗試過總共移動64位,但分多步? –
'unsigned long long i << = 63;我<< = 1;'無效簽名long long我= 64;'不 - 你說得對,謝謝。你知道我在哪裏可以閱讀更多關於此? – Kiwi
答案已經鏈接到有用的資源,所以我不打擾更多地混淆這個問題。 –