Was kostet C style Typwandlung



  • Hi,

    Was kostet eigentlich eine Typumwandlung.

    unsigned int a;
    signed int b;
    signed int c;
    
    c=b+(signed int)a;
    

    kann ma das so lassen oder sollte man a von vorne herein als signed int machen.



  • Gibts zu Weihnachten im Angebot:

    3 Umwandlungen: 4,99EUR
    Bis zum 24.12. gilt: Buy 3, get 1 free!



  • Bei ner x86 CPU würde der Compiler wohl einfach die verwendeten Befehle ändern, so dass eine signed Addition verwendet wird mit den ersten 16Bit von a.
    Also gäbe es kein Overhead in diesem Fall.


  • Mod

    Die Konvertierungsregeln sind bewusst derart gewählt, dass die Konvertierung bei der heute üblichen 2er-Komplementdarstellung ein No-op ist (Konvertierung zu großer Werte in signed ints ist trotzdem undefiniert!). Der Vorteil der 2er-Komplementdarstellung ist ja eben, dass für die einfachen Operationen Addition, Subtraktion und Multiplikation nicht zwei verschiedene Befehle benötigt werden. Im Übrigen ist das hier sowieso klar, da das Ergebnis der Konvertierung unmittelbar wieder zurück konvertiert werden muss, um den gemeinsamen Basistyp für die Addition zu haben.



  • @Frugger:
    Diese Umwandlung kostet nix, weil nix umgewandelt wird. Was Addition und Subtraktion angeht ist es egal ob man mit signed oder unsigned Werten arbeitet, soll heissen: es gibt keinen "signed" oder "unsigned" Addierbefehl, es gibt nur einen "allgemeinen" Addierbefehl der auf Grund der Binärdarstellung von positiven und negativen Zahlen mit beidem funktioniert.

    Was anderes ist es wenn man z.B. ein char in einen int umwandelt, das kostet meist 1 oder 2 Befehle.



  • Richtig teuer werden float-umwandlungen, weil hier die Binärdarstellung umgewandelt werden muß. (Gilt auch für float nach double)



  • Christkind schrieb:

    Gibts zu Weihnachten im Angebot:

    3 Umwandlungen: 4,99EUR
    Bis zum 24.12. gilt: Buy 3, get 1 free!

    Hab gleich mal 10 gekauft, braucht man doch immer wieder.



  • hustbaer schrieb:

    Diese Umwandlung kostet nix, weil nix umgewandelt wird.

    Auf Sprachebene betrachtet, muss man aber schon sagen, dass hier Umwandlungen stattfinden. Erst wird durch den Cast a in signed int "umgewandelt", durch usual arithmetic conversion wieder zurück nach unsigned int gewandelt. In der Praxis wird dadurch aber kein zusätzlicher Code erzeugt, da der Operand dann so verwendet werden kann, wie er deklariert ist.



  • groovemaster schrieb:

    hustbaer schrieb:

    Diese Umwandlung kostet nix, weil nix umgewandelt wird.

    Auf Sprachebene betrachtet, muss man aber schon sagen, dass hier Umwandlungen stattfinden. Erst wird durch den Cast a in signed int "umgewandelt", durch usual arithmetic conversion wieder zurück nach unsigned int gewandelt. In der Praxis wird dadurch aber kein zusätzlicher Code erzeugt, da der Operand dann so verwendet werden kann, wie er deklariert ist.

    Ja, Freund der Blasmusik, das hier ein Cast steht und das formal eine "Typenumwandlung" ist lese ich selbst bzw. weiss ich selbst. Es wird trotzdem im erzeugten Code nix umgewandelt.
    Und wieso bitte (formal betrachtet) wieder zurück? b und c sind signed, a nach signed gecastet - was sollte nach unsigned gewandelt werden?


Anmelden zum Antworten