将uint64_t截断为uint8_t [i]时,我应该使用位掩码吗?

时间:2016-04-06 01:16:17

标签: c++ arrays int type-conversion bit-manipulation

如果我有一个大的int,比如uint64_t,和一个uint8_t的数组,例如:

uint64_t large = 12345678901234567890;
uint8_t small[5];

我希望将uint64_t的8个最低有效位复制到uint8_t数组的元素中,是否可以安全使用:

small[3] = large;

或者我应该使用位掩码:

small[3] = large & 255;

即。是否有任何情况下大型int的其余部分可能以某种方式溢出到数组的其他元素中?

2 个答案:

答案 0 :(得分:4)

肯定不会导致数据处理不正确。但是,某些编译器可能会生成警告消息。

有两种方法可以避免这些。

您可以投射变量:

(uint8_t)large

或者你可以禁用警告:

#pragma warning(disable:4503)

我建议投射变量,因为隐藏编译器警告可能会使您无法发现实际问题,因此不是最佳做法。

答案 1 :(得分:2)

完全安全

small[3] = large;

并在[conv.integral]中明确描述了这种转换:

  

如果目标类型是无符号的,则结果值是与源一致的最小无符号整数   整数(modulo 2 n 其中n是用于表示无符号类型的位数)。

也就是说,这四个陈述都保证在small[3]中以相同的值结束:

small[3] = large;
small[3] = large % 256;
small[3] = large & 255;
small[3] = static_cast<uint8_t>(large);

没有功能上的理由去做%&或自己投,但是如果你想要的话我会感到惊讶,如果编译器没有生成相同的所有四个代码(gcc和clang do)。

如果您使用-Wconversion之类的东西进行编译,则会产生一个警告(有时可能会有所帮助)。在这种情况下,您将要进行演员表。