Cで64ビットの整数を使うにはどうすればいいですか?

7062 ワード

まず、ANSI C 99規格には64ビットの整数タイプがありません.第二に、多くの実際のコンパイラは、64ビットの整数タイプに対するサポートを実現している.具体的な分析は、http://blog.csdn.net/lychee007/archive/2010/04/04/5449237.aspxを参照してください.ここで鍵はこのテーブルです.
変数の定義
出力モード
gcc(mingw 32)
g+(mingw 32)
gcc(linux i 386)
g+(linux i 386)
Microsoft Visual C++6.0
long long
“%lld”
エラー
エラー
正しいです
正しいです
コンパイルできませんでした
long long
'%I 64 d'
正しいです
正しいです
エラー
エラー
コンパイルできませんでした
同前int 64
「lld」
エラー
エラー
コンパイルできませんでした
コンパイルできませんでした
エラー
同前int 64
'%I 64 d'
正しいです
正しいです
コンパイルできませんでした
コンパイルできませんでした
正しいです
long long
cout
非C++
正しいです
非C++
正しいです
コンパイルできませんでした
同前int 64
cout
非C++
正しいです
非C++
コンパイルできませんでした
コンパイルできませんでした
long long
printint 64()
正しいです
正しいです
正しいです
正しいです
コンパイルできませんでした
私たちは、VC++6.0ビットの整数のサポートが一番「それ」です.
本の中のコードを再発行します.2.4.3 64ビットの整数
正の整数を入力して、その正の因子の個数を統計します.n<=(10の12乗)
標準C言語の解法:コンパイラ:TCC(基本的にはC 99の国際標準です.すごいです.)
0001 /*



0002     2.4.3,64   

0003       

0004          n,         

0005     n<=(10 12  )



0006     

0007 

0008            , 1  ,         x;      (n%x==0) ,    count  1

0009 



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
",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 C 2632:'long'followed by'long'is illegal
これはVC++6.0がlong longを識別できないという証明です.では、VC++6.0は、上記のコードに必要な64ビットの整数をどうやって完成させますか?以下のコードを見てください.
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
",x); */
0014 if (n/x==x) count=count-1; 0015 } 0016 } 0017 printf(" :%I64d",count); 0018 return; 0019 }
上記のコードは、いずれも10の12乗以内の大きな整数のデータ入力を正しく処理することができます.信じない?試してみてください