3
我看到一些奇怪的行为,使用msdev 2010的__int64类型。任何人都可以告诉我发生了什么? 我想有2个问题在这里,首先如何显示64位整数,其次行为 - 即为什么它看起来像__int64实际上是一个32位INT ......如预期printf 64位类型说明符问题
#include <stdio.h>
int main()
{
int vl_idx;
unsigned __int64 vl_64;
unsigned __int64 vl_64_test;
for (vl_idx = 0; vl_idx < 64; vl_idx++)
{
vl_64 = 1 << vl_idx;
printf ("vl_64 (%d) = %I64u\n", vl_idx, vl_64);
printf ("vl_64 (%d) = %llu\n", vl_idx, vl_64);
printf ("vl_64 (%d) = %lu\n", vl_idx, vl_64);
}
vl_64_test = 1 << 31;
if (vl_64 > vl_64_test)
printf ("greater\n");
if (vl_64 == vl_64_test)
printf ("equal\n");
if (vl_64 < vl_64_test)
printf ("less\n");
return 0;
}
输出的第30次迭代:
vl_64 (0) = 1
vl_64 (0) = 1
vl_64 (0) = 1
vl_64 (1) = 2
vl_64 (1) = 2
vl_64 (1) = 2
...
vl_64 (30) = 1073741824
vl_64 (30) = 1073741824
vl_64 (30) = 1073741824
vl_64 (31) = 18446744071562067968
vl_64 (31) = 18446744071562067968
vl_64 (31) = 2147483648
vl_64 (32) = 1
vl_64 (32) = 1
vl_64 (32) = 1
vl_64 (33) = 2
vl_64 (33) = 2
vl_64 (33) = 2
...
vl_64 (62) = 1073741824
vl_64 (62) = 1073741824
vl_64 (62) = 1073741824
vl_64 (63) = 18446744071562067968
vl_64 (63) = 18446744071562067968
vl_64 (63) = 2147483648
equal
但是,那么事情?溢出?在第32次迭代。这可能只是一个显示问题,但最后的比较表明不然。 这是用msdev 2010 cl(64位版本)编译并在64位windows操作系统(64位CPU)上运行。任何建议,为什么比较说明1 < < 31 == 1 < < 63?
感谢您的任何建议,
吉姆
是的,就是这样。感谢那。 MS似乎并不了解1LLU,但是如果我将1转换为(无符号__int64),它会达到同样的效果 - 输出如预期。 – 2013-05-07 10:59:01