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个可用位的假设是不正确的,但为什么呢?
数字2 ^ 64要求65位正确表示二进制 - 位#65设置,其余为零.
这与无符号8位数字最多只能达到255(2 ^ 8 - 1)的原因相同,无符号16位数字最多只能达到65535(2 ^ 16 - 1),依此类推.
| 归档时间: |
|
| 查看次数: |
204 次 |
| 最近记录: |