转换为较小类型时 C++ 截断

标签 c++ casting type-conversion bit-fields

我有一个 64 位 long int,其中包含一些位域。我需要将存储在第二个和第三个字节中的 16 位带符号整数添加到一个 32 位值中。我正在使用这样的东西:

u32 Function( s32 value , u64 bitfield )
{
    return value + (s16) (bitfield >> 8)
}

在将位域扩展为 32 位有符号整数并执行加法之前,我能否依赖编译器将位域转换为 16 位有符号整数?如果不是,我还应该如何截断剩余字节并执行我需要的类型转换?

最佳答案

是的,需要注意的是您依赖于特定于编译器和体系结构的行为。当然,依赖这种行为会使您陷入真正难以诊断的“特征”(错误)。

您可能最好写出(告诉编译器)您具体想要什么,让优化通过,而其他过程则消除不必要的代码:

u32 Function(s32 value, u64 bitfield)
{
  // Extract 16 bit qty from 64-bit: (x|x|x|x|x|1|2|x), preserving
  // signedness
  return value + (s32) (((bitfield << 40) >> 48) & 0xffffffff);
}

(是的,在那里发表评论也有助于 future 的维护者。)

关于转换为较小类型时 C++ 截断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36630912/

相关文章:

c++ - 如何绕过模板虚函数来实现我的目标?

c++ - VS2015中的一个编译问题

将 C 结构转换为 unsigned char

arrays - 字典中数组中的 Swift 字典

python - 将字符串转换为 int 或 inverse 更有效?

c++ - C 中的显式强制转换

c++ - 动态数组初始化

c++ - C++0x 的 REPL/LINQpad/F# 交互式替代方案?

c - 二进制转换器不适用于大数

c++ - 这些哪个更快?