3

msdev 2010 で __int64 型に奇妙な動作が見られます。何が起こっているのか誰か教えてもらえますか? ここには 2 つの問題があると思います。1 つ目は 64 ビット int を表示する方法、2 つ目は動作です。つまり、__int64 が実際には 32 ビット int のように見えるのはなぜですか...

#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 OS (64 ビット CPU) で実行されていました。比較が 1<<31 == 1<<63 と述べている理由について何か提案はありますか?

ご提案ありがとうございます。

ジム

4

1 に答える 1