Der folgende Code ohne Warnung erstellt:Bit Verschiebung führt zu seltsamer Typkonvertierung
std::uint16_t a = 12;
std::uint16_t b = a & 0x003f;
jedoch zusammen mit dem bitweisen eine Bit-Verschiebung durchführte und führt zu einer ‚impliziten Guss Warnung‘:
std::uint16_t b = (a & 0x003f) << 10; // Warning generated.
Sowohl gcc als auch clang beklagen, dass es eine implizite Konvertierung von int
zu uint16_t
gibt, aber ich verstehe nicht, warum die Einführung der Bitverschiebung dazu führen würde, dass der Ausdruck der rechten Hand plötzlich zu int
wird.
EDIT: Für Clang kompilierte ich mit den -std=c++14 -Weverything
Flags; für gcc habe ich mit den -std=c++14 -Wall -Wconversion
Flags kompiliert.
Der Ausdruck wird in beiden Fällen als "int" ausgewertet. Würden Sie für diese Warnung Compiler-Einstellungen (vielleicht ein Online-Beispiel) bereitstellen? Ich bekomme diese Warnung nicht in einem schnellen Experiment, weder von GCC noch von – AnT
@AnT Probieren Sie "-Wconversion". Sie sollten dann die Warnung sehen. – Andrew
_ "Wenn der Operand, der an einen arithmetischen Operator übergeben wird, ein Integral- oder Unscoped-Aufzählungstyp ist, dann wird der Operand vor jeder anderen Aktion (aber nach der lvalue-to-rvalue-Konvertierung, falls zutreffend) vollständig befördert." _ [Http: // en.cppreference.com/w/cpp/language/operator_arithmetic](http://en.cppreference.com/w/cpp/language/operator_arithmetic) Siehe auch [this] (http://stackoverflow.com/questions/ 36925291/Bit-Shifting-Links-und-Verwerfen-Bits? Noredirect = 1 # comment61414105_36925291). – ZDF