zuweisung von literal an short



  • codewarrior meckert bei jeder zuweisung von literal an nicht-int wegen implizierter konvertierung rum. also bspw.

    short value = 12; // warnung wg. zuweisung von int an short
    

    msvc meckert bei solchen zuweisungen nicht - zumindest nicht bei den standardeinstellungen. ist codewarrior nun dümmer oder nur gründlicher? muss ich hier mit performance-einbußen rechnen, weil eine konvertierung von 32 bit nach 16 bit zur laufzeit passiert?

    also schreibe ich mittlerweile immer

    short value = short(12);
    

    es gibt nicht rein zufällig ein passendes suffix in der art von L , womit ich das literal als short ausweisen kann?



  • wieso sollte die zuweisung zur laufzeit geschehen, der wert (12) steht doch schon zur compilezeit fest.
    Warum Codewarrior daa rummeckert, verstehe ich allerdings auch nicht, denn selbst der müsste wissen, dass 12 innerhalb der Grenzen eines shorts liegt. GCC kompiliert es.
    edit: der gcc warnt aber, wenn ich eine so große zahl eingebe, die einen überlauf zu folge hätte.



  • Ich glaube es war nur ein Beispiel und bei der Zuweisung kann wohl auch eine Variable stehen. Vermute ich mal...



  • Fellhuhn schrieb:

    Ich glaube es war nur ein Beispiel und bei der Zuweisung kann wohl auch eine Variable stehen. Vermute ich mal...

    Naja, da er von einem Literal spricht, dann wird da keine Variable stehen dürfen.



  • Pöh. 😛 😃



  • ich merke gerade, dass ich das problem falsch dargestellt habe. die warnung kommt nicht bei *jeder* zuweisung. ein beispiel:

    std::pair<short, short> foo = std::make_pair(42, 23); // Warning: implicit arithmetic conversion from 'int' to 'short'
    
    std::pair<short, short> bar = std::make_pair(short(42), short(23)); // ok
    
    short baz = 12; // auch ok
    

    Heinzelotto schrieb:

    wieso sollte die zuweisung zur laufzeit geschehen, der wert (12) steht doch schon zur compilezeit fest.

    vielleicht weil der compiler dumm ist?


  • Administrator

    Nein, in dem Fall ist die Warnung sehr korrekt. Ich bin ehrlich gesagt etwas erstaunt, dass der Code überhaupt funktioniert. Die STL ist noch besser, als ich es gedacht hatte ^^
    std::make_pair(42, 23) liefert dir ein Objekt von Typ std::pair<int, int> zurück. Dieses wird dann dem std::pair<short, short> zugewiesen. Bei der Zuweisung kommt natürlich die Warnung, da der Compiler nicht mehr weiss, was in den Variablen steht.
    Um das zu umgehen, könntest du vielleicht das hier machen:

    std::pair<short, short> foo = std::make_pair<short, short>(42, 23);
    

    Du gibst explizit an, dass du ein std::pair<short, short> möchtest.

    Grüssli



  • Tachyon schrieb:

    Fellhuhn schrieb:

    Ich glaube es war nur ein Beispiel und bei der Zuweisung kann wohl auch eine Variable stehen. Vermute ich mal...

    Naja, da er von einem Literal spricht, dann wird da keine Variable stehen dürfen.

    Ha, und doch recht gehabt 😃 😉



  • das beispiel war jetzt aus der luft gegriffen, tatsächlich steht sowas da:

    typedef TollesFramework::Vector2<short, short> Point2D;
    Point2D foo(23, 42);
    

    und dabei kommt die warnung. ich weiß gerade nicht, was das template intern so treibt, aber wahrscheinlich ist es ähnlich dem pair-beispiel. ich kann die warnung mit einfachen zuweisungen nicht reproduzieren.



  • jetzt hab ichs:

    short foo = 23;
    short baz = foo + 42; // Warning: implicit conversion from 'int' to 'short'
    

    ist nicht normal, oder?



  • Doch. Denn bei einem binären Operator werden beide Operanden auf den höheren/größeren etc. gecastet. Das Ergebnis von short + int ist ein int.



  • und hat dann bar = foo + short(42); irgendeinen nachteil, außer dass man mehr tippen muss?



  • msvc zeigt übrigens bei dem code auch in der höchsten warnstufe nix an, deshalb hats mich so gewundert...



  • und comeau mit --strict-warnings auch nicht... 🙂


  • Mod

    ARMer progger schrieb:

    und hat dann bar = foo + short(42); irgendeinen nachteil, außer dass man mehr tippen muss?

    Es hat keinen Vorteil, weil es die entsprechende Warnung nicht unterdrücken dürfte. Denn auch das Ergebnis von
    foo+short(42)
    hat den Typ int



  • camper schrieb:

    foo+short(42)
    hat den Typ int

    ich meinte ja auch short(foo + 42) , bin aber zu blöd das auch zu schreiben.


Anmelden zum Antworten