Integer zu 16Bit-Zahl konvertieren



  • Und warum der Umweg über zwei 8-Bit Zahlen?

    b &= 0xffff;
    


  • Warum nicht einfach casten?

    uint16_t b2 = (uint16_t)b;
    

  • Mod

    DarkShadow44 schrieb:

    Warum nicht einfach casten?

    uint16_t b2 = (uint16_t)b;
    

    Was passiert denn, wenn du den Cast weg lässt?



  • SeppJ schrieb:

    Was passiert denn, wenn du den Cast weg lässt?

    Dann muss man sich ne Standpauke vom Compiler von wegen "integer precision" anhören? Oder? 😃


  • Mod

    Finnegan schrieb:

    SeppJ schrieb:

    Was passiert denn, wenn du den Cast weg lässt?

    Dann muss man sich ne Standpauke vom Compiler von wegen "integer precision" anhören? Oder? 😃

    Das wäre an der Stelle eher ungewöhnlich. Kannst du einen Compiler nennen, der da warnt? Expliziter als so kann man kaum schreiben, dass man eine Konvertierung zu uint16_t wünscht.



  • SeppJ schrieb:

    Finnegan schrieb:

    SeppJ schrieb:

    Was passiert denn, wenn du den Cast weg lässt?

    Dann muss man sich ne Standpauke vom Compiler von wegen "integer precision" anhören? Oder? 😃

    Das wäre an der Stelle eher ungewöhnlich. Kannst du einen Compiler nennen, der da warnt? Expliziter als so kann man kaum schreiben, dass man eine Konvertierung zu uint16_t wünscht.

    Wenn man den cast wegläßt?
    Die Frage haste sicher überlesen. 😮



  • SeppJ schrieb:

    Finnegan schrieb:

    SeppJ schrieb:

    Was passiert denn, wenn du den Cast weg lässt?

    Dann muss man sich ne Standpauke vom Compiler von wegen "integer precision" anhören? Oder? 😃

    Das wäre an der Stelle eher ungewöhnlich. Kannst du einen Compiler nennen, der da warnt? Expliziter als so kann man kaum schreiben, dass man eine Konvertierung zu uint16_t wünscht.

    Nein, kann ich nicht. War mir nicht bewusst, dass die Zuweisung als so eindeutig gewollt durchgeht, daher auch das etwas unsichere "Oder?" :D.
    Ist mir bisher noch nicht aufgefallen, weil ich in meinem Code auch solche überflüssigen Casts immer hinschreibe - um im Code zu dokumentieren, dass es mit voller Absicht geschieht (immerhin könnten bei obigem Cast ein paar Bits flöten gehen).

    Finnegan



  • SeppJ schrieb:

    Finnegan schrieb:

    SeppJ schrieb:

    Was passiert denn, wenn du den Cast weg lässt?

    Dann muss man sich ne Standpauke vom Compiler von wegen "integer precision" anhören? Oder? 😃

    Das wäre an der Stelle eher ungewöhnlich. Kannst du einen Compiler nennen, der da warnt? Expliziter als so kann man kaum schreiben, dass man eine Konvertierung zu uint16_t wünscht.

    clang:

    foo.cpp:6:20: warning: implicit conversion loses integer precision: 'std::uint32_t' (aka 'unsigned int') to 'std::uint16_t' (aka 'unsigned short') [-Wconversion]
            std::uint16_t j = i;
                          ~   ^
    


  • VS auch ab Warning Level 4:

    warning C4244: 'initializing' : conversion from 'unsigned int' to 'uint16_t', possible loss of data
    

    Finde ich auch nicht verkehrt. Wenn man es so hinschreibt ist zwar ziemlich klar, dass es eine Konvertierung gibt aber wenn man Funktionen mit uint16_t als Parameter hat und dort einen int übergibt würde ich schon gerne eine Info kriegen.



  • DirkB schrieb:

    Und warum der Umweg über zwei 8-Bit Zahlen?

    b &= 0xffff;
    

    Welchen Datentyp muss b dann haben? unsigned int? Ich muss halt eine Zahl abspeichern, die genau 16 Bit hat. Und wenn ich diese nachher wieder auslese, sollen genau wieder 16 Bit gelesen werden. uint16_t funktioniert nicht, weil der Compiler dann irgendwie stresst.



  • uint16_t funktioniert nicht, weil der Compiler dann irgendwie stresst.

    Sehr genaue Aussage...

    #include <cstdint>
    


  • Hyde++ schrieb:

    uint16_t funktioniert nicht, weil der Compiler dann irgendwie stresst.

    Sehr genaue Aussage...

    #include <cstdint>
    

    Ja, sorry, ich schrieb den Beitrag, als ich nicht an einem der Uni-Rechner saß und deshalb die genaue Meldung nicht nachsehen konnte... cstdint habe ich eingebunden, aber genau da kommt dann eben die Meldung. Die lautet:

    error: #error This file requires compiler and library support for the ISO C++ 2011 standard. This support is currently experimental, and must be enabled with the -std=c++11 or -std=gnu++11 compiler options

    Da ich von Linux und Compilern und whatever nicht so viel Ahnung habe, weiß ich nicht, wo ich das hinschreiben müsste. Dies ist mein Makefile:

    CXX = g++
    CXXFLAGS = -O2 -Wall 
    
    ma5b: unit.o mapraview.o greyscale.o 
    	$(CXX) $(CXXFLAGS)  unit.o mapraview.o greyscale.o -o ma5b   
    
    greyscale.o: unit.h greyscale.h greyscale.cpp   
    	$(CXX) $(CXXFLAGS) -c greyscale.cpp 
    
    mapraview.o: unit.h greyscale.h greyscale.cpp mapraview.cpp 
    	$(CXX) $(CXXFLAGS) -c mapraview.cpp 
    
    .PHONY: clean 
    clean: 
    	rm greyscale.o mapraview.o
    

    Wo und wie würde ich jetzt diese Compiler Options hinzufügen müssen? Das Paket habe ich in die greyscale.cpp eingebunden.


  • Mod

    wocknwolla schrieb:

    Wo und wie würde ich jetzt diese Compiler Options hinzufügen müssen? Das Paket habe ich in die greyscale.cpp eingebunden.

    Einfach in der 2. Zeile CXXFLAGS ergänzen.



  • Und zwar:

    -std=c++11
    

Anmelden zum Antworten