Forum: PC-Programmierung überlauf bei multiplikation ermitteln


von Ventano (Gast)


Lesenswert?

Hallo,
wenn ich (in c)
uint8_t x = 0xFF;
uint8_t y = 0xFF;
multipliziere, bekomme ich ein Ergebnis, welches uint16_t groß ist.
wenn beide jetzt 1 sind, passt das Ergebnis noch in uint8_t rein.
Jetzt bin ich am überlegen, welche möglichkeit es gibt, einen überlauf 
zu ermitteln und wenn ja, wie groß der ist. Gibt es da irgendwelche 
möglichkeiten?
Natürlich könnte ich auch beide direkt uint16_t groß machen. Es soll 
allerdings hinterher mit uint32_t auch funktionieren und größer kann ich 
nicht gehen. hier wäre das Ergebnis uint64_t. Diesen Datentyp habe ich 
aber nicht.

von N. M. (mani)


Lesenswert?

Dass ein Überlauf stattgefunden hat kannst du sehr leicht über eine 
Inline ASM Funktion abbilden die dir ein true bei Überlauf zurück gibt. 
Schau Mal bei den ASM Befehlen die dein Controller unterstützt.

Die Größe des Überlauf wirst du wohl durch eine Subtraktion, 
Ausmaskieren oder Modulo bestimmen müssen.

: Bearbeitet durch User
von Tom K. (ez81)


Lesenswert?

https://gcc.gnu.org/onlinedocs/gcc/Integer-Overflow-Builtins.html :
>The following built-in functions allow performing simple arithmetic operations 
together with checking whether the operations overflowed.

von voll der google checker (Gast)


Lesenswert?

https://stackoverflow.com/questions/1815367/catch-and-compute-overflow-during-multiplication-of-two-large-integers
1
   uint8_t x = 3;
2
   uint8_t y = 122;
3
4
   uint8_t z; // z=x*y
5
6
   // x * y > UINT8_MAX ---> overflow
7
   // also kein overflow, wenn
8
9
   if (y != 0 && (x > UINT8_MAX / y))
10
      puts("overflow!");
11
   else {
12
      z = x * y;
13
      printf("%d\n", z);
14
   }

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.