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

C++ truncating when casting to smaller types

本文关键字:类型 小类 转换 C++      更新时间:2023-10-16

我有一个64位长的int,其中包含一些位字段。我需要一个存储在第二个和第三个字节中的16位有符号int,并将其添加到32位值中。我用的是这样的东西:

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

我可以依靠编译器将位字段强制转换为16位有符号的int,然后再将其扩展为32位有符号int并执行加法吗?如果没有,我还应该如何截断剩余的字节并执行所需的类型转换?

是的,但需要注意的是,您依赖于编译器和体系结构特定的行为。当然,依赖这种行为会导致您陷入非常难以诊断的"特性"(bug)。

你最好写下(告诉编译器)你想要的具体内容,让优化通过,其他过程消除不必要的代码:

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);
}

(是的,在那里发表评论也有助于未来的维护人员。)