Forum: Mikrocontroller und Digitale Elektronik Rechenoperation


von Dennis (Gast)


Lesenswert?

Hallo zusammen,
ich programmiere gerade einen AT32UC3B unter Atmel Studio 7 und mir ist 
eins nicht klar. Es geht um die folgende Rechenoperation
1
unsigned short var1 = 0x00;
2
unsigned short var2 = 0x00;
3
4
var1 = var2 - 1U;

Das Ergebnis dieser Rechnung ist var1 = 0xFFFF.
Sollte es nicht aber 0 sein?

Grüße Dennis

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Dennis schrieb:
> Das Ergebnis dieser Rechnung ist var1 = 0xFFFF. Sollte es nicht aber 0
> sein?
Nein, das passt. Stichwort "Unterlauf"...

So ginge das weiter:
0 - 2U = 0xFFFE
0 - 3U = 0xFFFD
0 - 4U = 0xFFFC
0 - 5U = 0xFFFB
0 - 6U = 0xFFFA
0 - 7U = 0xFFF9
0 - 8U = 0xFFF8
:
:

: Bearbeitet durch Moderator
von Besucher (Gast)


Lesenswert?

Der o.g. AT32UC3B kennt durchaus auch Sättigungsarithmetik, allerdings 
gibt's dafür eigene Assemblerfebehle. Wie man die von C aus nutzt - 
k.A... Vielleicht gibt's dafür in irgendeinem Headerfile irgendwelche 
Macros?

von c-hater (Gast)


Lesenswert?

Dennis schrieb:

> Das Ergebnis dieser Rechnung ist var1 = 0xFFFF.

Völlig korrekt.

> Sollte es nicht aber 0 sein?

Wie kommst du denn darauf? Wenn ich von irgendeiner Ganzzahl eins 
abziehe, muss das Ergebnis verschieden von der ursprünglichen Ganzzahl 
sein.

Es sei denn, man benutzt Sättigungs-Arithmetik. Dafür hat C allerdings 
keine Operatoren und man kann sie in C auch nichtmal nachrüsten...

In C++ hingegen ginge das. (Das Nachrüsten entsprechender Operatoren für 
ebenfalls noch zu schaffende "gesättigte" Datentypen). Umsetzen müßte 
man den Kram (wenn er denn effizient sein soll) aber letztlich doch in 
der einzig wahren Sprache: Assembler...

Und das natürlich so, wie es sich gehört und wie es in Wahrheit auch 
fast immer ist: für jede Zielarchitektur anders. Echte Portibilität gibt 
es nicht, und das bissel, was es gibt, resultiert nur aus den 
Fähigkeiten der Compilerbauer (genauer: derjenigen, die die 
Codegeneratoren beisteuern) und der Tatsache, daß wenigstens diese Leute 
neben C/C++/weiss der Fuchs welche abgehobene Sprache auch Assembler 
beherrschen...

Asm rules...

von Adib (Gast)


Lesenswert?

Hallo Dennis,

 In C ist bei unsigned das Verhalten von Überlauf und Unterlauf 
definiert.
Bei signed ist das Verhalten nicht definiert.

Dein Beispiel ist also korrektes C.

Hth, Adib.

von F. T. (hansy)


Lesenswert?

Besucher schrieb:
> Wie man die von C aus nutzt -
> k.A... Vielleicht gibt's dafür in irgendeinem Headerfile irgendwelche
> Macros?

Grundsätzlich mit Inline-Assembly. Allerdings wird es wohl in den 
meisten Fällen sinnvoller sein die Sättigung über reinen C-Code selbst 
zu implementieren. Das erfordert zwar mehr Zyklen, dafür bleibt dein 
Code aber auch ohne Weiteres für andere Architekturen portierbar.

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.