Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;转换为较小类型时截断_C++_Casting_Type Conversion_Bit Fields - Fatal编程技术网

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

C++ C++;转换为较小类型时截断,c++,casting,type-conversion,bit-fields,C++,Casting,Type Conversion,Bit Fields,我有一个64位长的int,其中包含一些位字段。我需要一个16位有符号整数,存储在第二和第三个字节中,并将其添加到32位值。我用的是这样的东西: u32 Function( s32 value , u64 bitfield ) { return value + (s16) (bitfield >> 8) } 在编译器将位字段扩展为32位有符号整数并执行加法之前,是否可以依靠编译器将其强制转换为16位有符号整数?如果没有,我应该如何截断剩余的字节并执行所需的类型转换?是,但需要

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

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

在编译器将位字段扩展为32位有符号整数并执行加法之前,是否可以依靠编译器将其强制转换为16位有符号整数?如果没有,我应该如何截断剩余的字节并执行所需的类型转换?

是,但需要注意的是,您依赖于特定于编译器和体系结构的行为。当然,依赖这种行为将导致您进入非常难以诊断的“功能”(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);
}
u32函数(s32值,u64位字段)
{
//从64位提取16位数量:(x | x | x | x | x | 1 | 2 | x),保存
//签名
返回值+(s32)((位字段>48)和0xFFFFFF);
}

(是的,在那里添加注释也会对未来的维护人员有所帮助。)

虽然此解决方案会截断不需要的信息,但它不会保留16位的符号。我曾考虑使用类似的方法:返回值+((s32)位域>16);虽然我相信这会起作用,但我发现它令人吃惊地丑陋。好吧,你想保留符号的观点是正确的。然而,尽管“丑陋”,但你的意图是明确的(比特提取)并保留有符号性。让编译器努力选择合适的指令。不要过早优化。更新以保留有符号性,并将
位字段上的操作保持为
u64
,直到绝对必要。