簡體   English   中英

printf 64位類型說明符問題

[英]printf 64bit type specifier issue

我在msdev 2010中看到了__int64類型的一些奇怪行為。有誰能告訴我發生了什么? 我想這里有兩個問題,首先是如何顯示64位整數,其次是行為 - 即為什么它看起來像__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操作系統(64位CPU)上運行。 有關為什么比較表明1 << 31 == 1 << 63?

謝謝你的任何建議,

吉姆

在處理比int更寬的事情時,你需要小心整數文字,例如你需要改變:

vl_64 = 1 << vl_idx;

至:

vl_64 = 1LLU << vl_idx;

否則,在隱式轉換為無符號64位結果之前,右側將首先計算為int表達式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM