int 64ビット整数

5016 ワード

C/C++では、64は整数型であり、仕様が確定していないデータ型である.現在主流のコンパイラでは、64が整数型であることに対するサポートも標準的ではなく、形態が異なる.一般的に、64ビット整数型の定義方式はlong longと__である.int 64の2種類(VCは_int 64もサポート)であり、標準出力方式にはprintf("%lld",a)、printf("%I 64 d",a)、cout<本稿では,gcc(mingw 32),g++(mingw 32),gcc(linux i 386),g+(linux i 386),Microsoft Visual C++6.0の5つの一般的なC/C++コンパイラによる64ビット整数型のサポートについて論じる.残念なことに、この5つのコンパイラを互換性のある定義と出力の組み合わせはありません.異なるコンパイラ対64ビット整数を徹底的に明らかにするために、プログラムを書いてそれらを評価した結果、以下の表に示された.
変数の定義
しゅつりょくモード
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()
正しい
正しい
正しい
正しい
コンパイルできません
上の表では、コンパイルが通過し、実行が完全に正しいことを指しています.エラーとは、コンパイルが通過したが、実行結果が間違っていることを意味します.コンパイルできませんコンパイラはコンパイルできません.上の表を見ると、以下の点がわかります.
  • long long定義方式はgcc/g++に用いることができ、プラットフォームの制限を受けないが、VC 6に用いることができない.0.
  • __int 64はWin 32プラットフォームコンパイラ64ビット長整数型の定義方式であり、Linuxには使用できない.
  • "%lld"はLinux i 386プラットフォームコンパイラ、"%I 64 d"はWin 32プラットフォームコンパイラに使用されます.
  • coutは、VC 6でC++コンパイルにのみ使用できます.0ではcoutは64ビット長整数型をサポートしていません.

  • 表の最後の行の出力方式のprintint 64()は私が自分で書いた関数で、その互換性は他のすべての出力方式よりもよく、このようなコードであることがわかります.
    void printint64(long long a)
    {
        if (a<=100000000)
            printf("%d
    "
    ,a); else { printf("%d",a/100000000); printf("%08d
    "
    ,a%100000000); } }

    この書き方の本質は,大きな64ビット整数を2つの32ビット整数に分割し,順次出力し,低位の部分は0を補うことである.バカに見える書き方、効果はどうですか?cout出力方式と比較しました.coutとC++がプラットフォーム間でサポートされているからです.まずprintint 64()とcout(バッファをクリアしない)の実行結果はまったく同じで、エラーは発生しません.私の実験では、それぞれ100000個の乱数を出力しましたが、実際の結果、printint 64()は1.5 sでプログラムを完了し、coutは2 s必要です.coutは少し遅いので、大量のデータを出力する場合は、できるだけ使用しないでください.
    64ビット整数全解(補足板)64ビット整形による混乱は主に2つの面で,1つはデータ型の宣言,2つは入出力である.
    まず、もし私たちが自分の機械にプログラムを書いたら、状況は以下のように分類されます.
    (1)win下のVC 6.0では、データ型を宣言するときに書くべきです
    __int64 a;
    入出力時に%I 64 d
    scanf(”%I64d”,&a); printf(”%I64d”,a);
    (2)linuxの下のgcc/g++の中で、データ型の声明は書きます
    long long a;
    入出力時に%lld
    (3)winの下の他のIDEの中で[高バージョンのVisual Studioを含む]、データ型宣言は上の2種類を使ってもよい
    入出力用%I 64 d
    =================================
    以下はこのような混乱状況の解釈で、興味がなければスキップすることができます.
    まず、Javaなどの言語とは異なり、C/C++自体は各データ型のビット数を規定しておらず、大きさ関係を1つ限定しているだけであり、つまり、占めるbit数から言えばshort<=int<=long<=long long longと規定されている.具体的にどのタイプが何ビットを占有するかは、あなたが使用している開発プラットフォームのコンパイラによって決まります.現在のPCでは、intとlongが同じ32ビット、long longが64ビットという一般的な基準があります.ただし、ARMなどの他のプラットフォームに置き換えると、この数字は異なる場合があります.タイプが占めるサイズはsizeof()演算子で表示できます.
    long longはC 99規格で新たに導入されたデータ型で、古いVC 6.0にはこのタイプはないのでVC 6.0で「long long」を使用するとコンパイルエラーが発生します.64ビットの整数を表すために、VC 6にはマイクロソフトが独自に作ったデータ型が採用されています.int 64だからVC 6にいたら0でコンパイルするなら_int 64は64ビット整数を定義する.新しいVisual Studioはlong longをサポートしています.GCCはlong longをサポートしています.私たちがwinシステムで使用している他のIDE、例えばDev-Capp、Code::BlocksなどはMinGWコンパイル環境を採用していることが多く、GCCと互換性があるのでlong longもサポートされています(またMSと互換性があるため__int64もサポートされています).純粋なlinuxであればlong longしか使えません.
    printfを用いた入出力については,ここではより恥ずかしい場合がある.実際には、主な区別はオペレーティングシステムにあることを覚えておいてください.winシステムの下では、どんなコンパイラでも%I 64 dを使用します.linuxシステムの場合は、すべて%lldを使用します.MSが提供するmsvcrt.dllライブラリで使用されているのが%I 64 d方式で、Dev-ppなどは文法的に標準をサポートしているにもかかわらず、MSが提供するdllライブラリを使用してIOを完了しなければならないため、このような状況になった.
    =======================================
    ではACMerにとって、最も関心を持っているのは、それぞれのOJでどのような方法を使うべきかということです.実は方法は限られたいくつかしかありません.
    サーバがlinuxシステムの場合、定義はlong long、IOは%lld、サーバがwinシステムの場合、宣言はコンパイラに対して決定されます:+MSシリーズコンパイラの場合、宣言は_int 64[現在新版のVisual Studioでもlong longがサポートされています]+MinGW環境であれば、long long+どんなコンパイラでもIO一律%I 64 dと宣言
    以下に各OJの状況を以下のようにリストする.
    1.TOJ:Linuxシステム2.ZOJ:Linuxシステム3.POJ:Winシステム、言語はC/C++を選択するように、MSコンパイラ[2種類の声明をサポートする]を使って、GCC/G++を選択するように、MinGW 4である.UVa:Linuxシステム5.Ural:Winシステム、MSコンパイラ[2つの宣言をサポート]6.SPOJ:Linuxシステム7.SGU:Winシステム、MSコンパイラ[2つの宣言をサポート]
    よくわからない場合はまず各OJのFAQを見て、通常説明があります.
    また,混乱を避けるために,データ量が少ない場合はcin,coutで入出力を行うのも選択肢である.