以下代码在没有警告的情况下编译:
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
的隐式转换,但我不明白为什么引入移位会导致右 watch 达式为突然评估为 int
。
编辑:对于 clang,我使用 -std=c++14 -Weverything
标志进行编译;对于 gcc,我使用 -std=c++14 -Wall -Wconversion
标志进行编译。
最佳答案
在使用整数类型进行任何算术运算之前,总是先至少提升为(有时,但在本例中使用 gcc,unsigned
)int
。正如你所看到的 this example ,这首先适用于您,也适用于无警告变体。
绕过这些(诚然经常令人惊讶的)整数提升规则的最好方法可能是使用 unsigned int
(或普通平台上的 uint32_t
)去吧。
如果您不能或不想使用更大的类型,您可以将整个表达式的结果static_cast
返回到std::uint16_t
:
std::uint16_t b = static_cast<std::uint16_t>((a & 0x003f) << 10);
这将正确地产生 RHS 值 mod 2^16。
关于c++ - 移位导致奇怪的类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36940375/