【问题标题】:printf 64bit type specifier issueprintf 64位类型说明符问题
【发布时间】:2013-05-07 09:32:04
【问题描述】:

我在 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) = %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

感谢您的任何建议,

吉姆

【问题讨论】:

    标签: c visual-c++ visual-c++-2010


    【解决方案1】:

    在处理比int 更宽的任何内容时,您需要小心使用整数文字,例如你需要改变:

    vl_64 = 1 << vl_idx;
    

    到:

    vl_64 = 1LLU << vl_idx;
    

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

    【讨论】:

    • 是的,就是这样。感谢那。 MS 似乎不理解 1LLU,但如果我将 1 转换为 (unsigned __int64),它会实现同样的效果 - 并且输出符合预期。
    猜你喜欢
    • 2020-08-27
    • 1970-01-01
    • 2020-05-23
    • 2020-10-07
    • 1970-01-01
    • 2016-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多