嗯,这是一个奇怪的问题:
- 我正在使用
unsigned long long
变量(我甚至使用了相同效果的long
变量) - 我需要能够存储64位整数(
sizeof
返回8,这很好)
然而,当我尝试达到像1<<63
这样的值,并执行一些简单的位运算时,我会奇怪地得到负值。为什么呢?
我的测试代码:
unsigned long long c = 0;
c |= 1l << 56; printf("c = %lld\n",c);
c |= 1l << 63; printf("c = %lld\n",c);
输出:
c = 72057594037927936
c = -9151314442816847872
注:
- 当然,即使我直接执行
c = 1l<<63
,也会发生同样的事情。 - 所有测试均在Mac OS X 10.6上进行,并使用Apple的LLVM编译器3.0进行编译。
有什么建议吗?
sizeof(long)
是多少?我很惊讶1l<<63
能够工作,因为我认为它会将32位的1l
向左移动63位,使你得到一个值为零。但如果sizeof(long)
也是8,也许这就是它能够工作的原因。如果我是正确的,那么Jesse Rusak的答案就有一定的道理,尽管那个答案不能解决你的问题。 - phonetagger1l
应该改为1ull
以确保它至少有 64 位长。 - AusCBloke