C: signed und unsigned Rechenoperationen

#2956803
Lesenswert?

Ora et labora schrieb:
> das hieße, der signed-teil darf nicht negativ sein :(

na ja. dürfen tut er technisch schon.
Nur das Ergebnis ist halt nicht das, was du erwartest.

Durch die trickreiche Konstruktion des 2-er Komplements kannst du das 
Ergebnis wieder einer signed Variablen zuweisen und dann stimmt es sogar 
wieder.

Aber: streng genommen hast du dafür keine Garantie, da C nicht fordert, 
dass ein Computer mit 2-er Komplement rechnet. Theoretisch wäre auch was 
anderes möglich (und war früher, lange vor dem großen Krieg, auch so), 
aber heutzutage läuft praktisch alles auf 2-er Komplement.
Persönliche Seite #2956853
Lesenswert?

Was spricht den dagegen alle unsigned werte in signed zu casten und dann 
zu rechnen?
Die unsigned Eingabedaten dürfen dann natürlich nicht das oberste bit 
nutzen, aber da du ja davon ausgehts, das die Wertebereiche passend 
gewählt sind...

Karl Heinz Buchegger schrieb:
> Durch die trickreiche Konstruktion des 2-er Komplements kannst
> du das  Ergebnis wieder einer signed Variablen zuweisen und
> dann stimmt es sogar wieder.
Daran habe ich auch gedacht, im Prinzip müsste es da doch reichen alle 
negativen Werte im Notfall "per Hand" in 2-er Komplement unsigned ints 
zu konvertieren und dann unsigned weiterzurechnen.
Gast #2957013
Lesenswert?

Karl Heinz Buchegger schrieb:
> Ora et labora schrieb:
>> das hieße, der signed-teil darf nicht negativ sein :(
>
> na ja. dürfen tut er technisch schon.
> Nur das Ergebnis ist halt nicht das, was du erwartest.
>
> Durch die trickreiche Konstruktion des 2-er Komplements kannst du das
> Ergebnis wieder einer signed Variablen zuweisen und dann stimmt es sogar
> wieder.

Zumindest bei der Division dürfte das nicht funktionieren.

> Aber: streng genommen hast du dafür keine Garantie, da C nicht fordert,
> dass ein Computer mit 2-er Komplement rechnet. Theoretisch wäre auch was
> anderes möglich (und war früher, lange vor dem großen Krieg, auch so),
> aber heutzutage läuft praktisch alles auf 2-er Komplement.

Insbesondere arbeiten PCs schon immer mit 2er-Komplement.
#2957224
Lesenswert?

Rolf Magnus schrieb:

>> Durch die trickreiche Konstruktion des 2-er Komplements kannst du das
>> Ergebnis wieder einer signed Variablen zuweisen und dann stimmt es sogar
>> wieder.
>
> Zumindest bei der Division dürfte das nicht funktionieren.

Hast recht.
Ich hatte vergessen, dass er ja alle Operationen durchführen will.
Ich hatte jetzt nur

   i = i + o;

im Hinterkopf, welches auch dann durch das 2-er Komplement funktioniert 
wenn i signed, o unsigned und i negativ ist.
#2957935
Lesenswert?

das habe ich im inet gefunden
gilt das für C und C++?
1
    If both operands have the same type, then no further conversion is needed.
2

3
    Otherwise, if both operands have signed integer types or both have unsigned integer types, the operand with the type of lesser integer conversion rank is converted to the type of the operand with greater rank.
4

5
    Otherwise, if the operand that has unsigned integer type has rank greater or equal to the rank of the type of the other operand, then the operand with signed integer type is converted to the type of the operand with unsigned integer type.
6

7
    Otherwise, if the type of the operand with signed integer type can represent all of the values of the type of the operand with unsigned integer type, then the operand with unsigned integer type is converted to the type of the operand with signed integer type.
8

9
    Otherwise, both operands are converted to the unsigned integer type corresponding to the type of the operand with signed integer type.
Gast #2958113
Lesenswert?

Sven P. schrieb:
> Ist etwas haarig. Strenggenommen kann noch mehr passieren:

Da geht es um den Überlauf. Das gilt aber nur für vorzeichenbehaftete 
Rechnungen. Im oben Fall würde die Rechnung unsigned durchgeführt, wo es 
laut ISO C keinen Überlauf gibt. Letztendlich war im Ursprungsposting 
die Frage auch nur für die Fälle, in denen es keinen Überlauf gibt, 
gestellt.

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