printf 64位类型说明问题



我看到一些奇怪的行为与msdev 2010的__int64类型。有人能告诉我发生了什么事吗?我想这里有两个问题,首先是如何显示64位整型,其次是行为-即为什么它看起来像__int64实际上是一个32位整型…

#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) = %I64un", vl_idx, vl_64);
    printf ("vl_64 (%d) = %llun", vl_idx, vl_64);
    printf ("vl_64 (%d) = %lun", vl_idx, vl_64);
  }
  vl_64_test = 1 << 31;
  if (vl_64 > vl_64_test)
     printf ("greatern");
  if (vl_64 == vl_64_test)
     printf ("equaln");
  if (vl_64 < vl_64_test)
     printf ("lessn");
  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,有什么建议吗?

谢谢你的建议,

吉姆

在处理大于int的任何内容时,您需要小心整数字量,例如您需要更改:

vl_64 = 1 << vl_idx;

:

vl_64 = 1LLU << vl_idx;

否则,在隐式转换为无符号64位结果之前,首先将右侧计算为int表达式。

最新更新