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
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. –
... aber Vorsicht, ein Überlauf auf 'signed' ruft ein undefiniertes Verhalten hervor. –
Verwenden Sie 'long long result = var_uint32_bit - 1LL;' – chux