0

これは2つの部分からなる質問です。

  1. 数字を追加する小さなコードがあります。ただし、多くの場合、数値long longは保持できるよりも速く増加します。

    それで、私はそれを移動するためのクラスを作ると思いました。

    私の思考プロセスは3 long long a, b, c;

    すべてを追加しcc容量がいっぱいになったら、1を追加してゼロbに設定します。c一度b「満杯」になると、1を追加しaて設定bc、ゼロに設定します。

    cそのため、リセットして追加する前に、容量bがいっぱいかどうかを確認する必要があります。

    それをチェックする方法はありますか?

  2. 誰かが私を正しい方向に向けて自分のデータ型を作成できますか?視覚的にはlong long、上記のように3つを組み合わせると、データ型は上記で説明したことを実行します。

最後に、新しいデータ型をintと同じように扱いたいと思います。

int a = 0;

できるようになりたい

mydatatype a = 0;

英語は私の第一言語ではありません。

4

3 に答える 3

2

整数が容量に達しているかどうかをテストすることは、コードが非常に非効率になることを意味します。たとえば、123を追加するには、123の増分と123の比較を行う必要があります。

より良い方法は、操作を実行する前に、操作がオーバーフローするかどうかを判断することです。例(符号なし整数の場合のみ):

if(sum <= ULLONG_MAX - a) {
    sum += a;
} else {
    /* It would have overflowed */
}

ULLONG_MAX - aオーバーフローできないため、これは機能します。符号付き整数を調べ始めると、オーバーフローする可能性がありLLONG_MAX - aa負の場合)、LLONG_MIN - aオーバーフローする可能性がある(正の場合)ため、より大きな問題になりaます。両方の方法をテストする必要があります。

if( ( a > 0) && (sum <= LLONG_MAX - a) {
    sum += a;
} else if( ( a < 0) && (sum >= LLONG_MIN - a) {
    sum += a;
} else if( a != 0) {
    /* It would have overflowed */
}

オーバーフローしたかどうかを判断したら、そのケースを処理する必要があります。例えば; 1つの大きな整数を表すために複数の整数を使用している場合。次に(符号なし整数の場合):

if(sum_low <= ULLONG_MAX - a) {
    sum_low += a;
} else {
    sum_low -= (ULLONG_MAX - a) + 1;
    sum_high++;
}

元の(回避された)オーバーフローの処理に関連する一時的な計算で偶発的なオーバーフローを回避するために、非常に注意する必要があることに注意してください。

複数の符号付き整数を使用して1つの大きな符号付き整数を表す場合、オーバーフロー処理の背後にあるロジックは複雑になり、エラーが発生しやすくなります。理論的には可能です。ただし、数値の符号を分離してから、符号なし整数のみに対して演算(またはその逆-たとえば、負の数を加算する代わりに正の数を減算する)を実行する方がはるかに優れています。特に、1つの巨大な整数を表すために3つ以上の整数を使用する必要がある場合、または乗算や除算などのより複雑な演算が必要な場合。

もちろん、このパスを開始すると、独自の「大きな数」のコードを効果的に実装しているので、代わりに適切なライブラリを見つけて使用する必要があります。

最後に、新しいデータ型をプリミティブデータ型のように扱いたい場合(たとえば、のようなことができる場合mydatatype a = 0;)、運が悪いです-Cはこのようには機能しません。基本的に、Cは、コードを読んだり理解したりしようとする人々から複雑なものを隠すことができないため、美しいものです。また、疑いを持たない被害者から重要な情報を隠したい場合は、C++のようなあまり美しくない言語を使用する必要があります。;-)

于 2012-11-11T07:44:15.917 に答える
2

ヘッダー<limits.h>は、とりわけ以下を定義します。

  • LLONG_MAX— (signed) に格納できる最大値long long。最小許容値は +9223372036854775807 (2 63 -1) です。
  • ULLONG_MAX— に格納できる最大値unsigned long long。最小許容値は 18446744073709551615 (2 64 -1) です。

これらの値の適切な値と比較することで、数値がこれらの制限に達しているかどうかをテストできます。

于 2012-11-11T05:48:52.943 に答える
1

符号付きの数値について話している場合は、次のようにして、数値が「容量」に達しているかどうかを確認できます。

if (c > 0 && c + x < 0)

符号なしの数値の場合は次のようになります。

if (c + x < c)

どちらの場合も、オーバーフローをチェックするだけです。その後、オーバーフローが発生した場合b、 に 1 を追加し、残り ( MAX_LONG_LONG - c) を に戻しますcbからへの遷移についても同様aです。

独自の構造体を作成し、addそれらsubtractの構造体の周りの関数として記述するだけでなく、これを行う簡単な方法は考えられません。

于 2012-11-11T05:37:00.320 に答える