无符号Long Long超出范围?

Dr.*_*eon 9 c c++ 64-bit objective-c long-integer

好的,这是一个奇怪的问题:

  • 我正在使用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);
Run Code Online (Sandbox Code Playgroud)

输出:

c = 72057594037927936 
c = -9151314442816847872
Run Code Online (Sandbox Code Playgroud)

旁注:

  1. 当然,即使我c = 1l<<63直接做同样的事情也会发生.
  2. 所有测试均在Mac OS X 10.6上进行,并使用Apple的LLVM编译器3.0进行编译

有什么建议?

Aus*_*oke 22

说明符的d一部分%lld告诉printf该参数应该被视为有符号整数.用一个u代替:%llu.

从手册页:

我,我

int参数转换为带符号的十进制表示法.

o,u,x,X

unsigned int参数转换为 无符号 八进制(o),无符号 十进制(u)或无符号十六进制(x和X)表示法.

  • @Kameleon博士:不用担心,发生在每个人身上. (2认同)