2012-04-09 5 views
0

Ich versuche, zwei Funktionen zu schreiben, die Überlauf in c prüfen/verhindern (nur! ~ | &^+), aber kann es nicht bekommen. Das erste ist, wird ein bestimmtes zwei Kompliment/signed int in eine bestimmte Anzahl von Bits passen: fitsB (int x, int n) wo ist das int und n ist die Größe der Bits zu verwenden. Auch eine Funktion, die überprüft, ob zwei Ints nicht überlaufen, wenn sie zusammengefügt werden: overflowInt (int x, int y). Ich kann es bekommen, wenn sie nicht unterschriebene Ints sind, aber die Negative machen mir die Sache nur schwerer. Weiß jemand wie?Bitwise Überlaufprüfung c

Es gibt auch keine Gieß- und ints sind immer 32 Bit

+5

Sie haben vergessen, eine Frage zu stellen. –

Antwort

2
/* 
* addOK - Determine if can compute x+y without overflow 
* Example: addOK(0x80000000,0x80000000) = 0, 
*   addOK(0x80000000,0x70000000) = 1, 
* Legal ops: ! ~ &^| + << >> 
* Max ops: 20 
* Rating: 3 
*/ 
int addOK(int x, int y) { 
    // Find the sign bit in each word 
    //if a and b have different signs, you cannot get overflow. 
    //if they are the same, check that a is different from c and b is different from c, 
    // if they are the same, then there was no overflow. 
    int z=x+y; 
    int a=x>>31; 
    int b=y>>31; 
    int c=z>>31; 
    return !!(a^b)|(!(a^c)&!(b^c)); 
} 
+0

Wird dies für Sie funktionieren? – Eric

+0

'sizeof (int) * 8-1' sieht für mich sauberer aus als' 31'. –

+0

Es ist definitiv sauberer, ich benutzte 31 nur, weil wir das int als immer 32 Bit definiert hatten, und ich vermied alle Funktionen und Methoden außerhalb der "Legal Ops" definiert, wenn ich diese Funktion für einen Kurs, den ich nahm. – Eric

0

x in n Bits, wenn x < 2^(n-1) passen.

Die Überlauffrage benötigt weitere Informationen. Zwei Eingänge werden nicht überlaufen, wenn Sie sie einem langen (oder einem doppelten) zuweisen.

+0

Ohne Casting, nur 32bit int – Gekctek

0

Mit dem obigen Beispiel (Adam Shiemke) können Sie den maximalen (positiven) Wert und den minimalen Wert (negativ) finden, um den Bereich für n Bits zu erhalten. 2^(n-1) (aus Adams Beispiel) und minus eins für die maximale/positive Zahl, die in den n Bits dargestellt werden kann. Für den Minimalwert negiere 2^(n-1), um den Minimalwert x => - (2^(n-1)) zu erhalten; (Beachten Sie das> = nicht> für den minimalen Bereich). Zum Beispiel ist für n = 4 Bits 2^(4-1) - 1 = 2^3 -1 = 7, also x < = 7 und x> = -8 = (- (2^(4-1)).

Dies setzt voraus, dass die ursprüngliche Eingabe keine 32-Bit-Menge überschreitet (hoffentlich tritt ein Fehler in diesem Zustand auf) und die Anzahl der verwendeten Bits ist kleiner als 32 (da Sie 1 für den negativen Bereich hinzufügen und wenn Sie 32 Bit, es wird überlaufen, siehe unten für eine Erklärung.)

Um festzustellen, ob die Addition überläuft, wenn Sie den Maximalwert haben, x + y < = Maximalwert.Mit Algebra können wir y erhalten < = maximaler Wert - x Sie können dann den übergebenen Wert für y vergleichen und wenn er die Bedingung nicht erfüllt, wird die Addition überlaufen, zB wenn x der maximale Wert ist, t hen y < = 0, also muss y kleiner oder gleich null sein oder die Addition wird überlaufen.

Verwandte Themen