0u, 0.0f, 0ul, 0l usw. auch für andere Datentypen?



  • Hi,

    ihr kennt ja sicherlich diese feinen Teile die man hinter Zahlen schreiben kann um den Datentyp direkt zu spezifizieren.

    Also diese hier: 0u, 0.0f, 0ul, 0l

    Ich bräuchte aber einen für unsigned char und unsigned short. (Gibt es noch mehr von diesen Buchstaben für hinter die Zahlen?)

    Problem ist folgendes: Ich habe einen unsigned long aus dem ich einen unsigned short machen muß. Die ersten 8 bit sind uninteressant, aber die letzten 8 sind wichtig für mich.

    Daher extrahiere ich vorher meinen unsigned long in 4 werte von unsigned chars mit bitshifts. a,r,g,b

    a wird uninteressant, aber r,g,b brauche ich. diese bringe ich wiederum mit bitshifts in die richtige position des unsigned shorts. nachteil: er motzt von wegen konversation 😞 Casts sind etwas langsam dafür, daher frage ich. Denn mit bitshifts kann man den typ ja schon konvertieren indem man hinter der zahl einen diesen Buchstaben setzt.

    Hat jemand eine idee?



  • '#' schrieb:

    Casts sind etwas langsam dafür, daher frage ich.

    Casts von Konstanten??? Die werden doch schon zur Compile-Zeit ausgefuehrt, brauchen zur Laufzeit genau null Zeit. Und nein, solche Suffixe gibt's nicht, weil C eh nur mit Integern oder groesser rechnet.



  • ➡ union



  • @SG1
    gut, dann erkläre mir wieso wenn ich hier casts rein stopfe das programm grotten lam wird aber ohne nicht aber warnungen bleiben?

    unsigned long bla = 0xFF336699;
        unsigned char r = bla >> 16; 
        unsigned char g = bla >> 8;
        unsigned char b = bla;
        unsigned short blubb = (bla << 16) | (bla << 8) | (bla);
    

    @unreg
    unsigned long = 4 byte, unsigned short = 3 byte. da union rein? oh wei...



  • Seltsamerweise ist mein Posting verschwunden...

    @'#' auf was für ner Architektur und mit welchem Compiler arbeitest du? 3Byte große shorts hab ich noch nirgends gesehen.



  • '#' schrieb:

    @SG1
    gut, dann erkläre mir wieso wenn ich hier casts rein stopfe das programm grotten lam wird aber ohne nicht aber warnungen bleiben?

    Weil Dein Compiler nicht optimiert? Vernuenftige Compiler berechnen Dein komplettes Programm zur Compilezeit, fertig.



  • Any schrieb:

    auf was für ner Architektur und mit welchem Compiler arbeitest du? 3Byte große shorts hab ich noch nirgends gesehen

    Dito.

    @'#'

    unsigned long bla = 0xFF336699;
        unsigned char r = (unsigned char)(bla >> 16);
        unsigned char g = (unsigned char)(bla >> 8);
        unsigned char b = (unsigned char)(bla);
        unsigned short blubb = (unsigned short)(bla << 16) | (bla << 8) | (bla));
    

    Und gut ist.

    Ansonsten gibt es für r, g und b auch noch folgende Möglichkeit:

    unsigned long bla = 0xFF336699;
        unsigned char* rgb = reinterpret_cast<unsigned char*>(&bla);
        unsigned char r = rgb[2];
        unsigned char g = rgb[1];
        unsigned char b = rgb[0];
    

Log in to reply