2017-03-22 4 views
-1

Gibt es eine einfache Möglichkeit, einen Überlauf beim Herunterzählen durch einen negativen Wert zu ersetzen?Convert overflow to negative

Zum Beispiel eine 32-Bit-Variable. Mögliche Werte sind 0x00000000 - 0xFFFFFFFF. Wenn ich 1 vom niedrigsten möglichen Wert (0x00000000 - 1) subtrahiere, ist das Ergebnis 0xFFFFFFFF. Wie kann der Vorgang geändert werden, um ein Ergebnis von -1 zu erhalten?

+1

Indem Sie es signierten Typ anstelle von "unsigned" machen. Sie können die Werte '0x00000000' -' 0xFFFFFFFF' * und * '-1' nicht speichern, ohne auf 64-Bit zu gehen. –

+1

... aber Vorsicht, ein Überlauf auf 'signed' ruft ein undefiniertes Verhalten hervor. –

+0

Verwenden Sie 'long long result = var_uint32_bit - 1LL;' – chux

Antwort

1

Gibt es eine einfache Möglichkeit, einen Überlauf beim Herunterzählen durch einen negativen Wert zu ersetzen?

Verwenden Sie größere Mathematik ist ein direkter Ansatz.

"B. ein 32-Bit-Variable Mögliche Werte sind 0x00000000 - 0xFFFFFFFF" bedeutet, dass die Variable einige ist unsigned Typ wie uint32_t.


1 von (uint32_t)0 Subtrahieren (uint32_t)0xFFFFFFFF als OP berichtete. So stattdessen einen breiteren signierten math wie long long (die mindestens 64-Bit) oder int64_t

// Insure subtraction is done using `long long` math with 1LL 
long long result = var_uint32_bit - 1LL; 

Alternativ Code mit einer entsprechenden gleichen Breite haften könnte Typen signiert.

// Only non-implementation defined for values 0...0x7FFFFFFF 
int32_t result = (int32_t)var_uint32_bit - 1; 

Die (int32_t)var_uint32_bit weist eine Einschränkung in Bezug auf Umwandlung eines unsigned Typ einer signierten Integer-Typ.

Andernfalls ist der neue Typ signiert und der Wert kann nicht darin dargestellt werden; entweder ist das Ergebnis implementierungsdefiniert oder es wird ein implementierungsdefiniertes Signal erzeugt. C11dr §6.3.1.3 3