soll casten oder lieber nicht



  • hallo,

    ich wuerde gern wissen ob hier casten gut oder lieber nicht.

    BYTE byVar = 24;
    int nVar = 300;
    
    // soll hier gecastet sein oder lieber nicht wege ungewueschte effekt
    if (byVar == nVar) {
    // mach irgendwas
    }
    
    // so etwa
    if ((int)byVar == nVar) {
    // mach irgendwas
    }
    
    // oder lieber so
    if (byVar == (BYTE) nVar) {
    // mach irgendwas
    }
    

    und wie siehts mit int und unsigned int aus??



  • Das sind sowieso beides (hässliche) C-Casts. Und der Cast ist unnütz.



  • Was ist BYTE, ich kenn nur char 🙄



  • 314159265358979 schrieb:

    Was ist BYTE

    Ein (unnötiges) typedef aus <windef.h> . Ich glaube so:

    typedef unsigned char BYTE;
    


  • EOutOfResources schrieb:

    314159265358979 schrieb:

    Was ist BYTE

    Ein (unnötiges) typedef aus <windef.h> . Ich glaube so:

    typedef unsigned char BYTE;
    

    Ich weiß 🙄



  • 314159265358979 schrieb:

    Ich weiß 🙄

    Aso. *IroniedetektorKick*



  • 314159265358979 schrieb:

    EOutOfResources schrieb:

    314159265358979 schrieb:

    Was ist BYTE

    Ein (unnötiges) typedef aus <windef.h> . Ich glaube so:

    typedef unsigned char BYTE;
    

    Ich weiß 🙄

    Dann lass solche sinnlosen Kommentare in Zukunft einfach.



  • @casting frage:

    BYTE byVar = 24;
    int nVar = 300;
    
    // In diesem Fall vollkommen OK.
    // Problem könnte es nur geben, wenn BYTE gleich breit ist wie int, und BYTE unsigned ist.
    // Im Falle MSVC bzw. GCC unter Windows ist das allerdings nicht so.
    // Und so lange BYTE schmäler ist als int, wird der BYTE Wert hier implizit nach int konvertiert vor dem Vergleich.
    if (byVar == nVar) {
    }
    
    // Bitte gewöhne dir C-Style Casts ab. Ansonsten OK.
    if ((int)byVar == nVar) {
    }
    
    // Ganz schlecht. Wenn nVar einen Wert hat der als BYTE nichtmehr dargestellt werden kann,
    // könnte der Vergleich hier "true" Ergeben, obwohl die Werte gar nicht gleich sind.
    if (byVar == (BYTE) nVar) {
    }
    

    und wie siehts mit int und unsigned int aus??

    Jo, das ist etwas doof.
    Unsigned hat hier Vorrang, d.h. ohne Cast wird der int Wert zu unsigned int konvertiert. Wenn der int negativ war kommt dabei allerdings Unsinn raus. D.h. man müsste es so schreiben:

    int intVal = ...;
    unsigned int uintVal = ...;
    
    // OK
    if (intVal >= 0 && intVal == uintVal) {
    }
    

    Wenn der Compiler dabei ne Warning wirft, dann halt nochmal extra casten:

    // zum Warning unterdrücken:
    if (intVal >= 0 && static_cast<unsigned int>(intVal) == uintVal) {
    }
    

    Ist aber eigentlich überflüssig.



  • EOutOfResources schrieb:

    314159265358979 schrieb:

    Was ist BYTE

    Ein (unnötiges) typedef aus <windef.h> . Ich glaube so:

    typedef unsigned char BYTE;
    

    Was ist daran unnötig?



  • Ethon schrieb:

    Was ist daran unnötig?

    Ich habe "unnötig" zwischen Klammern gesetzt, da z.B. ich es total nutzlos finde, hingegen aber andere nicht.



  • EOutOfResources schrieb:

    Ich habe "unnötig" zwischen Klammern gesetzt, da z.B. ich es total nutzlos finde, hingegen aber andere nicht.

    Es erhöht die Lesbarkeit des Codes und das ist nie unnötig.

    @Topic
    Es spielt keine große Rolle, ob du hier castest. Dein Compiler wird dies erkennen und beides folgendermaßen übersetzen:

    movzx       eax,byte ptr [byVar]  
    xor         ecx,ecx  
    cmp         eax,dword ptr [nVar]  
    sete        cl
    

    Die interessantere Frage ist hier, wie überhaupt dazu kommt, dass die beiden Variablen die du vergleichst unterschiedliche Typen haben. I.d.R. sollte dies eine Ausnahme sein, denn Vergleichen tut man nur "sich gleichende" Dinge.



  • // Bitte gewöhne dir C-Style Casts ab. Ansonsten OK.

    Wieso? Gibt es irgendeinen Vorteil bei einem static_cast?



  • Ja, man sieht aus einer Meile Entfernung, was dort passiert. Außerdem sind die C++ Casts viel spezifischer, was wohin gecastet werden kann - hinter einem C-Cast kann sich nahezu alles verbergen, ohne daß du es ihm von außen ansiehst.


  • Mod

    CStoll schrieb:

    hinter einem C-Cast kann sich nahezu alles verbergen, ohne daß du es ihm von außen ansiehst.

    Vor allem weiß es ein unerfahrener Programmierer oftmals selber nicht, was der Cast gerade macht. Wenn man hingegen zu einem const_cast oder gar einem reinterpret_cast greifen muss um eine Konvertierung durchzuführen, hat man ein deutliches Alarmzeichen, dass da vielleicht was anderes nicht in Ordnung ist.



  • Ok, danke 🙂



  • vielen dank fuer eure antworten, einige sind sehr hilfreich. ich hatte noch mit alter source code und bad programmier style zu tun. weil sehr viel solche vergleiche da sind hab ich keine lust alles auf C++ cast umzuschreiben. grosser aufwand wenig wirkung.



  • danke an alle schrieb:

    ... weil sehr viel solche vergleiche da sind hab ich keine lust alles auf C++ cast umzuschreiben. grosser aufwand wenig wirkung.

    Es mag in der Regel wenig Wirkung haben, in den Sonderfällen kann aber die Fehlersuche mehr Aufwand bedeuten, als der Aufwand es einmal zu korrigieren (Solche Fälle sind mir schon in echten Projekten untergelaufen, wo nur aus Faulheit keine C++ Casts verwendet wurden sind).


Anmelden zum Antworten