Rechenoperation

Gast #4802492
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
Gast #4802639
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?
Gast #4802679
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...
#4802696
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren