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

时间:2016-04-14 18:16:39

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

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

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

我可以依赖编译器将位域转换为16位带符号的int,然后再将其扩展为32位带符号的int并执行添加吗?如果没有,我应该如何截断剩余的字节并执行我需要的类型转换?

1 个答案:

答案 0 :(得分:6)

是的,但需要注意的是,您依赖于编译器和体系结构特定的行为。当然,依靠这种行为会导致你进入真正难以诊断的特征" (错误)。

你可能最好写出来(告诉编译器)你想要什么,让优化通过和其他通过消除不必要的代码:

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

(是的,发表评论也有助于未来的维护者。)