Ich habe zwei Ganzzahlen ohne Vorzeichen, a und b. Jetzt ist mein Ziel, den absoluten Wert der Differenz zwischen den beiden zu erhalten.Subtrahieren von zwei Ganzzahlen ohne Vorzeichen und Erhalten des absoluten Wertes des Ergebnisses
Zeit, was ich tue ist:
uint64_t a, b;
llabs((int64_t)(a - b))
Diese scheint jedoch zu arbeiten, ich bin mir nicht sicher, ob es ist. Kann jemand bestätigen?
Ja die Abhilfen nicht das Problem sind, ich habe mich nur gefragt, ob das richtig funktionieren würde. Ich bin mit unsignierten Ints etwas nicht vertraut. Eine Erklärung, warum das Überlaufen wäre, würde geschätzt, wenn Sie die Zeit haben! – ge0rges
Zuallererst, wenn b> a, wird die Subtraktion ein negatives Ergebnis haben. Dies ist ein Problem, da vorzeichenlose Ganzzahlen keinen negativen Wert enthalten können. (Dies führt dazu, dass sie unsigniert werden.) Allerdings gibt es einige Regeln für das Verhalten von unsignierten Überläufen und das Umwandeln in vorzeichenbehaftete Werte, wie Sie es taten. Und da es üblich ist, die 2. Ergänzung zu verwenden, wird es in der realen Welt funktionieren. Der negative Bereich vorzeichenbehafteter Ganzzahlen ist jedoch die Hälfte des Bereichs vorzeichenloser Ganzzahlen. Daher können Sie ein negatives Ergebnis erzeugen, das von einer vorzeichenbehafteten Ganzzahl nicht gehalten werden kann. –
Lassen Sie uns ein Beispiel für eine 3-Bit-Ganzzahl haben. Vorzeichenlose Werte haben den Bereich von 0 ... 7. Vorzeichenbehaftete Ganzzahlen haben den Bereich von + 3 ... -4. Es ist klar, dass die vorzeichenlose Subtraktion einen Wert erzeugen kann, der außerhalb des Bereichs der vorzeichenbehafteten Ganzzahl liegt. –