为什么我不能在64位机器上以无符号长整数存储2 ^ 64?

pap*_*iro 2 c binary unsigned integer x86-64

我错过了什么吗?我运行了以下内容:

$ uname -a
Linux archlinux 4.16.6-1-ARCH #1 SMP PREEMPT Mon Apr 30 12:30:03 UTC 2018 x86_64 GNU/Linux
Run Code Online (Sandbox Code Playgroud)

然后在C程序中:

long l;
printf("sizeof long: %d\n", sizeof l);
Run Code Online (Sandbox Code Playgroud)

哪个输出:

sizeof long: 8
Run Code Online (Sandbox Code Playgroud)

这是不是意味着每个long包含64位?但是当我执行以下代码行时:

printf("2^64: %ld\n",  1UL<<64);
Run Code Online (Sandbox Code Playgroud)

我从gcc收到以下警告:

sizeof.c:14:29:警告:左移计数> =类型宽度[-Wshift-count-overflow]

如果我将左移位减少到63,则警告消失,但输出:

2 ^ 64:-9223372036854775808

这让我相信我的无符号长度为64个可用位的假设是不正确的,但为什么呢?

Ari*_*yck 9

数字2 ^ 64要求65位正确表示二进制 - 位#65设置,其余为零.

这与无符号8位数字最多只能达到255(2 ^ 8 - 1)的原因相同,无符号16位数字最多只能达到65535(2 ^ 16 - 1),依此类推.

  • @papiro因为您将其打印为带签名的号码.请参阅achal的评论. (3认同)