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

如果我有一个大的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的其余部分可能以某种方式溢出到阵列的其他元素?

解决方法

这非常安全:
small[3] = large;

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

If the destination type is unsigned,the resulting value is the least unsigned integer congruent to the source
integer (modulo 2n where n is the number of bits used to represent the unsigned type).

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

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

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

一个区别是,如果您使用-Wconversion之类的东西进行编译,这会导致发出警告(这有时可能是有益的).在这种情况下,你会想要演员.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...