C++在转换为较小类型时截断
C++ truncating when casting to smaller types
我有一个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);
}
(是的,在那里发表评论也有助于未来的维护人员。)
相关文章:
- 调用具有未标识类型的类的方法
- C++ 中模板化类型的类层次结构
- 根据模板类型选择类模板的成员类型?
- C++从抽象类型定义类成员
- 实例化具有不完整类型的类模板格式不正确(如果该类型是在之后定义的)
- 重载模板<类型名...>类的函数模板
- 在设计方面:重载vector类型的类成员的插入运算符
- 错误:使用 SWIG 的未知类型名称"类"
- 添加字符串类型的类成员会导致调用基类函数而不是子函数
- 包装任意类型/非类型模板类的模板类
- 使用相同方法但不同成员类型构建类的最佳方法
- 如何删除类内类类型的类成员指针
- 为什么我不能在同一行中定义两个相同类型的类的成员指针
- 如何仅从类类型推断类构造函数参数的类型
- 为什么要返回对小类成员的 const 引用?
- (C++);动态决定函数的类型(派生类)
- 具有容器变量类型的类模板
- 如何基于模板参数类型施放类模板
- 包含仅移动类型的类的构造函数应通过引用还是通过右值引用接收仅移动类型?
- 无法将类型为"类名 &"的非常量左值引用绑定到类型为"类名"的右值