转换为较小类型时 C++ 截断
C++ truncating when casting to smaller types
我有一个 64 位 long int,其中包含一些位域。我需要将存储在第二个和第三个字节中的 16 位带符号整数添加到一个 32 位值中。我正在使用这样的东西:
u32 Function( s32 value , u64 bitfield )
{
return value + (s16) (bitfield >> 8)
}
我能否依赖编译器将位域转换为 16 位有符号整数,然后再将其扩展为 32 位有符号整数并执行加法?如果不是,我还应该如何截断剩余字节并执行我需要的类型转换?
是的,但需要注意的是您依赖于特定于编译器和体系结构的行为。当然,依赖这种行为会让你陷入真正难以诊断的 "features"(错误)。
你可能最好写出(告诉编译器)你具体想要什么,让优化通过,其他过程消除不必要的代码:
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);
}
(是的,在那里发表评论也会对未来的维护者有所帮助。)
我有一个 64 位 long int,其中包含一些位域。我需要将存储在第二个和第三个字节中的 16 位带符号整数添加到一个 32 位值中。我正在使用这样的东西:
u32 Function( s32 value , u64 bitfield )
{
return value + (s16) (bitfield >> 8)
}
我能否依赖编译器将位域转换为 16 位有符号整数,然后再将其扩展为 32 位有符号整数并执行加法?如果不是,我还应该如何截断剩余字节并执行我需要的类型转换?
是的,但需要注意的是您依赖于特定于编译器和体系结构的行为。当然,依赖这种行为会让你陷入真正难以诊断的 "features"(错误)。
你可能最好写出(告诉编译器)你具体想要什么,让优化通过,其他过程消除不必要的代码:
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);
}
(是的,在那里发表评论也会对未来的维护者有所帮助。)