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

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

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

最佳答案

是的,但请注意,您依赖于特定于编译器和体系结构的行为。当然,依靠这种行为会导致您陷入真正难以诊断的“功能”(错误)。

您最好写出(告诉编译器)您具体想要的东西,让优化过程和其他过程消除不必要的代码:

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

(是的,在此处发表评论也将对将来的维护者有所帮助。)

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

10-11 23:12
查看更多