PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [c] Signed, unsigned - cast.


noid
2006-08-10, 08:42:00
Gibt es eine Vorschrift was passiert, wenn ich eine singed int-zahl, welche zudem negativ ist, in unsigned caste?

Wird dieser Wert dann "astronomisch" groß, oder wird er auf null gesetzt? Ich nehme an, dass ersteres der Fall ist. Stimmt das?

zeckensack
2006-08-10, 08:58:34
Er wird "astronomisch groß".

Aber du beschränkst dich derzeit noch auf den wenig spannenden Fall wenn beide Variablen gleich breit sind. Viel interessanter ist das Verhalten wenn man zB einen negativen signed char zu unsigned int umwandelt, also generell schmal nach breit.

Ich glaube dann wird zB aus -3 +252 (und nicht 4294967292, was man bekommt wenn man mit einem signed int gestartet wäre). Müsste nachher nochmal nachsehen wie das genau ist, aber sollte schon stimmen.

noid
2006-08-10, 09:19:14
Aber hier mal die Zeile um die es geht:


temp = (T_SLONG)current - (currentOffsetSaved - CURRENT_OFFSET);


Alle 3 Werte sind unsigned und der Wert wird total falsch. CURRENT_OFFSET kann größer als currentOffsetSaved werden. Vergisst der dann das Vorzeichen beim weiteren Rechenschritt, weil das Zwischenergebnis in ein anderes Register geschoben wird?


temp = (T_SLONG)current - currentOffsetSaved + CURRENT_OFFSET;

Hiermit klappt es selbstverständlich.

PS: ist nicht von mir gewesen - ich frag mich nur wieso ;)

Kabelsalat
2006-08-10, 09:21:33
In erstem Beispiel verursachst du einen Überlauf und alles was den gültigen Bereich überschreitet wird brutal abgeschnitten.