c に似たコンパイラを構築していますが、 2^32 より大きい整数を解析したいと考えています。どのように可能ですか?どのようにして大きな整数が Python や Ruby のような言語で実装されたのか..!!
7 に答える
この種のことを行うためのライブラリがあります。
gmplibをチェックしてください。
膨大な数のライブラリがあります。完全なリストについては、このウィキペディアの記事を参照してください。
GMP(GNU Multiple Precision Arithmetic Library)は、私が遭遇したすべてのものに十分です。NTLはほとんど同じですが、オブジェクト指向です。
一般に、これらのライブラリは、独自のロールを作成したい場合、数字の各桁を文字として配列で数字を表しますが、それは大変な作業です。
自分で書きたい場合は、私の思い出の旅をたどってください;-)。
コンピューターが8ビットを使用していた昔。多くの場合、大きな数 (> 255 など) で計算する必要がありました。そして、私たちは皆、ルーチンを書かなければなりませんでした。たとえば追加。
2 バイトの数値を相互に追加する必要がある場合は、次のアルゴリズムを使用しました。
- 最下位バイトを追加します。
- 結果が 8 ビットを超えた場合、キャリー ビットがセットされました。
- 最上位バイトとキャリー フラグ (設定されている場合) を追加します。
- 結果が 8 ビットを超えた場合、オーバーフロー エラーが生成されました (ただし、2 バイト以上が必要な場合は、これを行う必要はありません。
これを、より多くのバイト/ワード/dwords/qwords および他の演算子に拡張できます。
Felix von Leitner によるいくつかのビッグナムの基本をカバーするスライドがあります。個人的には、非常に有益で技術的だと思います。
ネットで入手できるある種のbigintライブラリが必要になると思います。少し検索するだけで、プロジェクトに適したライブラリが見つかるかもしれません。
なぜなら、単に整数を解析するだけでは十分ではないと私は信じているからです。ユーザーは、そのような数値を保存するだけでなく、おそらく操作を実行したいと思うでしょう。
これを実現するには、c である種の構造体を使用する必要があります。x64 ではなく x86 プラットフォームを使用している場合、これは難しいことがわかります。x86 を使用している場合は、アセンブリとキャリー フラグに慣れる準備をしてください。
幸運を!