如何在 C 中使用 64 位元整數?

來源:互聯網
上載者:User

首先:ANSI C99標準中並沒有64位整數類型。其次,許多實際的編譯器,都實現了對64位整數類型的支援。
具體的分析,參見:http://blog.csdn.net/lychee007/archive/2010/04/04/5449237.aspx
其中關鍵是這個表格:

變數定義 輸出方式 gcc(mingw32) g++(mingw32) gcc(linux i386) g++(linux i386) MicrosoftVisual C++ 6.0
long long “%lld” 錯誤 錯誤 正確 正確 無法編譯
long long “%I64d” 正確 正確 錯誤 錯誤 無法編譯
__int64 “lld” 錯誤 錯誤 無法編譯 無法編譯 錯誤
__int64 “%I64d” 正確 正確 無法編譯 無法編譯 正確
long long cout 非C++ 正確 非C++ 正確 無法編譯
__int64 cout 非C++ 正確 非C++ 無法編譯 無法編譯
long long printint64() 正確 正確 正確 正確 無法編譯

我們注意到,VC++ 6.0對64位整數的支援是最“那個”的。

重新給出書中的代碼:2.4.3 64位整數

題目:輸入正整數,統計它的正因子個數。n<=(10的12次方)

標準C語言的解法:
編譯器:TCC(基本上就是C99的國際標準,可厲害了!)

0001 /*0002     2.4.3,64位整數0003     例子0004     輸入正整數n,統計它的正因子個數0005     n<=(10的12次方)0006     0007     解題思路:0008         窮舉法,從1開始,窮舉每個可能的因子x;對於滿足條件(n%x==0)的,將計數器count增量10009         窮舉的技巧:0010             只需要窮舉[1..sqrt(n)]的範圍即可;0011             如果x是n的因子,那麼(n/x)也是n的因子。0012 0013      0014 */0015 # include "stdio.h"0016 # include "math.h"0017 void main() {0018     long long n,0019         x,  /*假設的因子*/0020         count=0; /*計數器*/0021 0022     scanf("%I64d",&n);0023     for (x=1; x<=(long long)sqrt(n); x=x+1) {        0024         if (n%x==0) {0025             count=count+2; /*之所以+2,是因為x和(n/x)都是n的因子*/0026             /* printf("%I64d\n",x); */0027             if (n/x==x) count=count-1;0028         }0029     }0030     printf("因子個數:%I64d",count);0031 0032     return;0033 }

上述代碼寫得本身沒有什麼問題,但是在VC++ 6.0中編譯時間,會被告知:

……test.c(4) : error C2632: 'long' followed by 'long' is illegal

這就是VC++ 6.0不能識別 long long 的明證!

那麼,VC++ 6.0要如何完成上述代碼中所需的64位整數呢?

請看下面的代碼:(唯一的秘訣就是把 long long 改成 __int64;注意:int64 的左邊有兩個底線哦!

0001 # include "stdio.h"0002 # include "math.h"0003 void main() {0004     __int64 n,0005         x,  /*假設的因子*/0006         count=0; /*計數器*/0007 0008     scanf("%I64d",&n);0009     printf("%I64d",n);0010     for (x=1; x<=(__int64)sqrt(n); x=x+1) {        0011         if (n%x==0) {0012             count=count+2; /*之所以+2,是因為x和(n/x)都是n的因子*/0013             /* printf("%I64d\n",x); */0014             if (n/x==x) count=count-1;0015         }0016     }0017     printf("因子個數:%I64d",count);0018     return;0019 }

請注意,上述代碼,均可以正確處理10的12次方以內的超大整數的資料輸入。

不信?你試試看!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.