繁体   English   中英

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

[英]Should I use a bit mask when truncating uint64_t to 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的其余部分可能以某种方式溢出到数组的其他元素?

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

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

你可以投射你的变量:

(uint8_t)large

或者您可以禁用警告:

#pragma warning(disable:4503)

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

非常安全

small[3] = large;

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

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

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

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

有没有功能上的原因做%&或投自己,但如果你想反正我会感到惊讶,如果编译器未生成所有四个(gcc和铛做)相同的代码。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM