【发布时间】:2016-04-06 01:16:17
【问题描述】:
如果我有一个大的 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 的其余部分可能会以某种方式溢出到数组的其他元素中?
【问题讨论】:
-
绝对安全。一些编译器会发出警告(恕我直言,这是一个虚假的警告,因为代码是正确的)所以使用掩码没有害处。如果你想记录意图,你可以使用
static_cast<uint8_t>(large);。 -
我会从“小”中删除数组,因为它在这个问题上没有任何作用。
-
@xvan 实际上是数组让我担心。使用单个 uint8_t,我会毫不犹豫地写
small = large。 -
(large & 255) 确实具有使人类读者非常清楚的有益效果,即您确实确实打算丢弃除最低 8 位以外的所有位,并且不只是意外失败请注意,您正在将 64 位值分配给 8 位变量。 static_cast
(large & 0xFF) 可能会更好。
标签: c++ arrays int type-conversion bit-manipulation