在将uint64_t截断为uint8_t[I]时,我应该使用位掩码吗
Should I use a bit mask when truncating uint64_t to uint8_t[i]?
如果我有一个大int,比如一个uint64_t和一个uint 8_t数组,例如:
uint64_t large = 12345678901234567890;
uint8_t small[5];
我想把uint64_t
的8个最低有效位复制到uint8_t
数组的一个元素中,只使用安全吗
small[3] = large;
或者我应该使用位掩码:
small[3] = large & 255;
即,是否存在大int的其余部分可能以某种方式溢出到数组的其他元素中的情况?
它肯定不会导致数据处理错误。但是,某些编译器可能会生成警告消息。
有两种选择可以避免这种情况。
您可以投射您的变量:
(uint8_t)large
或者您可以禁用警告:
#pragma warning(disable:4503)
我建议强制转换变量,因为隐藏编译器警告可能会使您无法发现实际问题,因此不是最佳做法。
这是完全安全的:
small[3] = large;
并且在[conv.integral]:中明确描述了这种转换
如果目标类型是无符号的,则得到的值是与源一致的最小无符号整数整数(模2n,其中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
的东西进行编译,这将导致发出警告(有时这可能是有益的)。在这种情况下,你会想做演员。
相关文章:
- 我应该使用什么来代替void作为变体中的替代类型之一
- boost::asio::steady_timer()与sleep()我应该使用哪一个
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 我应该删除矢量<short>吗?
- 我应该如何修改此代码以使用给定字符串中的字母打印菱形图案
- 我应该在锁定TBitmap画布后解锁它吗
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- 我应该避免多重实现继承吗
- 为了方便起见,我应该避免公开私有字段变量吗
- 我收到同义重复编译器错误。我应该如何修复"类型"X"的参数与类型"X"的参数不兼容?
- 违反const正确性:我应该现实地期待什么问题
- 我应该如何表示我拥有的连续元素序列?
- 位移操作和位掩码未检测到重复字符
- 在CRC-16 CCITT中将数据从二进制解码为文本,我应该输入一个码字,使用CRC生成器进行编码
- 我在处理序列化时是否应该硬码变量大小?C
- 我如何制作一点掩码,只掩盖了32位的某些零件(索引)
- SSE:我是否应该将shuffle掩码设置为静态变量
- 在将uint64_t截断为uint8_t[I]时,我应该使用位掩码吗
- 我可以在位掩码中包含多少选项?