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の国際標準です.すごいです.)
…test.c(4):error C 2632:'long'followed by'long'is illegal
これはVC++6.0がlong longを識別できないという証明です.では、VC++6.0は、上記のコードに必要な64ビットの整数をどうやって完成させますか?以下のコードを見てください.
変数の定義
出力モード
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乗以内の大きな整数のデータ入力を正しく処理することができます.信じない?試してみてください