Fundamental types的大小在1到8之间(也许是16)。这意味着它们在内存中占用的位数不超过128,即uint8_t
中可以容纳的位数。
现在,假设我写了一些函数,它需要这么多的位。例如,假设它是
template <typename T>
inline void clear_bit(T& x, magic_type bit_index ) {
static_assert(std::is_fundamental_v<T>, "Go away.");
x = x & ~(T{1} << bit_index);
}
我想知道magic_type
用什么:应该是uint8_t
吗?还是应该只是一个整数,因为无论如何我都需要检查有效性,即使对于uint8_t
情况,并且int
还是更自然的数字类型?
让这个问题减少您的个人意见:通常认为其中一种选择更惯用吗?如果没有,您是否能找到两个选择的充分理由?还是建议第三个?
答案 0 :(得分:3)
无论您在表达式{{1}中用于bit_index
的哪种类型,在任何情况下,它都会被提升为T{1} << bit_index
或int
,并且结果为unsigned int
本身是T{1} << bit_index
的升级类型。这意味着T{1}
总是产生至少与x & ~(T{1} << bit_index)
一样大的类型。
表达式int
仅在
T{1} << bit_index
时定义良好。对bit_index >= 0 && bit_index < (sizeof +T{}) * CHAR_BIT)
的后续分配可能仍会截断结果。
根据经验,如果要在算术表达式中使用变量,请使用x
或int
。在按位算术上下文中,通常最好使用unsigned int
,否则只需使用unsigned
。
底线:使用signed
,或者可能使用unsigned int
。