Forum: Mikrocontroller und Digitale Elektronik Gemischte Datentypen


von Georg M. (g_m)


Lesenswert?

Spricht etwas dagegen, das Ergebnis einer arithmetischen Operation in 
die Variable eines anderen Datentyps zu speichern?

Z.B. Subtraktion:
4 Byte - 4 Byte ==> 2 Byte

uint32_t minuend;
uint32_t subtrahend;
uint16_t difference;

Z.B.:
67108864 - 67107840 = 1024

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Ja, nämlich dann, wenn das Ergebnis nicht passt.

 Z.B.:
67108864 - 1 = 67108863

von NurEinGast (Gast)


Lesenswert?

67108864 - 1 = 67108863
Passt nicht in die uint_16

von NurEinGast (Gast)


Lesenswert?

... war zu langsam ...

von Sebastian K. (sek)


Lesenswert?

Rufus Τ. F. schrieb:
> Ja, nämlich dann, wenn das Ergebnis nicht passt.
>
>  Z.B.:
> 67108864 - 1 = 67108863

Oder anders ausgedrückt:

Ich würde mich sehr darüber ärgern, wenn ich 67108864€ auf meinem Konto 
hätte, 1€ abhebe und anschließend nur noch 65535€ drauf habe, weil der 
Programmierer des Bankings so dämlich war die 32-Bit auf 16-Bit zu 
kürzen.

von Georg M. (g_m)


Lesenswert?

Rufus Τ. F. schrieb:
> Ja, nämlich dann, wenn das Ergebnis nicht passt.

Hoffentlich wird der Chip nicht zerstört?


Aber falls das Resultat die reservierte Bitbreite nicht überschreitet, 
ist dann alles fehlerfrei?

von W.S. (Gast)


Lesenswert?

Georg M. schrieb:
> Aber falls das Resultat die reservierte Bitbreite nicht überschreitet,
> ist dann alles fehlerfrei?

Und wie willst du das prüfen?

Das ganze ist ein Abschneiden relevanter Bits und das sollte man nur 
dann wagen, wenn man mit allerletzter Sicherheit ganz genau weiß, daß da 
NIEMALS was passieren könnte. Sonst hast du nämlich ne Hausnummer 
anstelle einer Differenz und kannst das nichtmal merken.

Was mir da als Beispiel einfällt, sind die (zumindest mir) noch immer 
unverständlichen Verhältnisse bei einem CIC-Dezimator nach Hogenauer: 
zuerst eine oder mehrere Additionsstufen (die überlaufen können und 
dürfen) und dann ebensoviele Differenzierer. Aber OK, zumindest bei 
Xilinx wachsen dafür die Datenbreiten ins Erhebliche an, mehr als 80 Bit 
für die Register mittendrin scheinen keine Seltenheit zu sein.

Und du willst Bits abschneiden...

W.S.

von A. S. (Gast)


Lesenswert?

Georg M. schrieb:
> Aber falls das Resultat die reservierte Bitbreite nicht überschreitet,
> ist dann alles fehlerfrei?

Was ist dann Deine Frage? Und wenn ja, für welche Programmiersprache?

Wenn Dein Ergebnis 0..32767 ist, dann reicht eine 2-Byte Variable (*) 
aus.

Wenn Dein Ergebnis -32768..65535 ist, dann solltes Du Dir frei nach 
Hamlet schon um signed oder nicht seigned gedanken machen.





*)bei aktuellen CPUs mit 2er-Komplement und 8Bit pro Byte etc.

von S. R. (svenska)


Lesenswert?

Georg M. schrieb:
> Spricht etwas dagegen, das Ergebnis einer arithmetischen Operation in
> die Variable eines anderen Datentyps zu speichern?

Für Division (32 Bit geteilt durch 16 Bit ergibt 16 Bit) ginge das, für 
alle anderen klassischen Operationen (Addition, Subtraktion, 
Multiplikation, beliebige Bitoperationen) nicht.

von Karl M. (Gast)


Lesenswert?

S. R. schrieb:
> Georg M. schrieb:
>
> Für Division (32 Bit geteilt durch 16 Bit ergibt 16 Bit) ginge das, für
> alle anderen klassischen Operationen (Addition, Subtraktion,
> Multiplikation, beliebige Bitoperationen) nicht.

Nein stimmt nicht eine 32 Bit Zahl/ 1 ist immer noch eine 32 Bit Zahl.

von Sebastian S. (amateur)


Lesenswert?

Wenn Du genau weist in welchem Zahlenbereich das zu speichernde Ergebnis 
liegt, kannst Du die Datentypen kunterbunt mischen.
Da aber vieles im "Hintergrund" passiert, ist so etwas nicht zu 
empfehlen. Vor allem, wenn Du Zahlen mit und ohne Vorzeichen mischt. 128 
wird dann schnell zu -1.

Weißt Du aber genau, welche Ziffern auftreten können, spricht nichts 
dagegen (uint8_t) = (uint32_t) + (uint32_t) durchzuführen.
Sollte aber Deine Annahme nicht zutreffen, gibt es keine Fehlermeldung 
im Falle eines Falles. Also dann ist halt 120 + 136 = 0(!)

von c-hater (Gast)


Lesenswert?

Georg M. schrieb:

> Spricht etwas dagegen, das Ergebnis einer arithmetischen Operation in
> die Variable eines anderen Datentyps zu speichern?

Nein. Jedenfalls nicht, solange sie sicher da rein passen wird...

Allerdings ist die Zahl der Probleme, bei denen das gegeben ist, sicher 
sehr klein im Verhältnis zur Gesamtzahl aller denkbaren Probleme...

Das sollte dich aber nicht ernsthaft entmutigen. Denn selbst, wenn man 
immer Hochsprachen-treudoof beim gewählten Datentyp bleibt, ist dieses 
Verhältnis oft nicht wirklich besser...

von S. R. (svenska)


Lesenswert?

Karl M. schrieb:
> Nein stimmt nicht eine 32 Bit Zahl/ 1 ist immer noch eine 32 Bit Zahl.

Hast du natürlich recht, Asche auf mein Haupt.

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.