16位有符号整数的64位位打包与还原:该位转换方式是否安全?
16位有符号整数打包至64位无符号整数的方案验证
需求
将范围在[-32768, 32768)的16位有符号整数打包进64位无符号整数,后续可准确还原为原范围的有符号整数。
打包方案
核心思路:先得到目标16位有符号整数,立即转为16位无符号整数,扩展为64位无符号整数后,通过位移将这16位放到指定位置。
打包伪代码:
已知整数x、y满足 x - y ≥ -32768 且 y - x < 32768; const int MASK_POS = 45; const unsigned short int u_s = x - y; unsigned long long int ull_s = u_s; ull_s <<= MASK_POS;
还原方案
核心思路:从64位无符号整数中提取指定位置的16位无符号数据,再转回16位有符号整数。
还原伪代码:
已知64位无符号整数ull_s的第46到61位存储了16位有符号整数的编码; const unsigned short int u_s = ((ull_s >> MASK_POS) & 0xffff); const short int s_s = u_s; const int difference_x_and_y = s_s;
疑问与验证思路
我认为该方案合理,但担忧负数位移操作存在平台特定行为。不过先转同位数无符号再扩位,还原时先提取指定位长无符号再转同长有符号的流程,应该能保证跨平台安全。
注:该64位无符号整数的其余48位将存储大量其他数据,从高3位到低31位及中间14位均已分配用途。我可编写单元测试验证跨架构一致性,但希望提前发现潜在问题。
内容的提问来源于stack exchange,提问作者dscerutti
相关产品推荐
相关产品推荐

