4

size_t私が気づいたいくつかの動作に混乱しています:

size_t zero = 0x1 << 32;
size_t big = 0x1 << 31;
size_t not_as_big = 0x1 << 30;
printf("0x1<<32: %zx\n0x1<<31: %zx\n0x1<<30: %zx\n", zero, big, not_as_big);

結果:

0x1<<32: 0
0x1<<31: ffffffff80000000
0x1<<30: 40000000

今、私はそれsize_tが最低でも16ビットの符号なし整数であることが保証されていることを理解していますが、なぜ0x1<<31それがした値になるのか理解できません.

x86_64 で LLVM を使用しています。

4

2 に答える 2