2
2つの符号なし整数aとbを持っています。今私の目標は、2つの違いの絶対値を得ることです。2つの符号なし整数を引き算し、結果の絶対値を得る
現在、私がやっているのです:
uint64_t a, b;
llabs((int64_t)(a - b))
このは、しかし、私はそれがあるかどうかわからないんだけど、仕事にです。誰でも確認できますか?
2つの符号なし整数aとbを持っています。今私の目標は、2つの違いの絶対値を得ることです。2つの符号なし整数を引き算し、結果の絶対値を得る
現在、私がやっているのです:
uint64_t a, b;
llabs((int64_t)(a - b))
このは、しかし、私はそれがあるかどうかわからないんだけど、仕事にです。誰でも確認できますか?
まあ、値によっては問題があります。 a=0
とb
の最大値がint64_t+1
より大きい場合は、オーバーフローが発生します。あなたの本当の世界の価値がそうすることができるかどうかは分かりません。
しかし、あなたはそれがはるかに簡単に持つことができます。
a>b?a-b:b-a
うん回避策が問題になることはありません、それが正しく動作するかどう私は思っていました。私は、符号なし整数には少し慣れていません。あなたは時間があれば、それがなぜオーバーフローするのかについての説明をお聞かせください! – ge0rges
まず、b> aの場合、減算は負の結果になります。これは、符号なし整数に負の値を含めることができないため、問題です。しかし、署名されたオーバーフローや署名付きの値へのキャストの振る舞いにはいくつかルールがあります。しかし、それは2番目の補数を使用するのが一般的であるため、現実世界で動作します。しかし、符号付き整数の負の範囲は、符号なし整数の範囲の半分です。したがって、負の結果を作成することができますが、これは符号付き整数では保持できません。 –
3ビット整数の例を見てみましょう。符号なしの値の範囲は0〜7です。符号付き整数は+ 3〜-4の範囲です。符号なし減算が、キャストした符号付き整数の範囲外の値を作成できることは明らかです。 –