下面的代碼編譯沒有警告:位移導致奇怪類型轉換
std::uint16_t a = 12;
std::uint16_t b = a & 0x003f;
然而,隨着按位沿執行比特移位並導致「隱式轉換警告」:
std::uint16_t b = (a & 0x003f) << 10; // Warning generated.
gcc和clang都抱怨說有一個從int
到uint16_t
的隱式轉換,但我不明白爲什麼引入位移會導致右手錶達突然評估爲int
。
編輯:對於鏗鏘聲,我編譯了-std=c++14 -Weverything
標誌;對於gcc,我編譯了-std=c++14 -Wall -Wconversion
標誌。
在這兩種情況下,表達式的計算結果都是「int」。你會提供編譯器設置(可能是一個在線的例子)這個警告?我沒有在一個快速實驗中得到這個警告,既沒有來自海灣合作委員會,也沒有從鐺 – AnT
@AnT嘗試'-Wconversion'。那麼你應該看到警告。 – Andrew
_「如果傳遞給算術運算符的操作數是整數或非範圍枚舉類型,那麼在執行任何其他操作之前(但在左值到右值轉換之後(如果適用)),操作數會進行整數提升。」_ [http:// en.cppreference.com/w/cpp/language/operator_arithmetic](http://en.cppreference.com/w/cpp/language/operator_arithmetic)另請參見[this](http://stackoverflow.com/questions/) 36925291 /比特移位左和 - 丟棄比特?noredirect = 1個#comment61414105_36925291)。 – ZDF