c++ - 移位导致奇怪的类型转换

标签 c++ type-conversion bit-shift

以下代码在没有警告的情况下编译:

std::uint16_t a = 12;
std::uint16_t b = a & 0x003f;

但是,与按位一起执行移位会导致“隐式转换警告”:

std::uint16_t b = (a & 0x003f) << 10; // Warning generated.

gcc 和 clang 都提示存在从 intuint16_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/

相关文章:

permutation - 查找下一个具有特定汉明权重的数字

c - 正确的移位给出了错误的结果,有人可以解释一下吗

c++ - C++ 中标识符名称的长度是否有限制?

c++ - sleep 功能无法解决

c++ - 如何更高效地遍历存储 {int, short, ushort,...} 的字符数组?

python - Matplotlib:没有字符串和轴反转的分类图

c++ - 关于如何使用循环数组实现 std::vector 的建议?

C++ 将模板参数转换为其无符号版本

mysql - 我将数据库转换为 utf-8,但旧数据仍在 windows-1251 中。如何转换呢?

java - 长的快速按位运算