基本类型的位数应该使用哪种类型?

时间:2018-12-10 22:55:09

标签: c++ bit idiomatic

在64位操作系统上,C ++中的

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还是更自然的数字类型?

让这个问题减少您的个人意见:通常认为其中一种选择更惯用吗?如果没有,您是否能找到两个选择的充分理由?还是建议第三个?

1 个答案:

答案 0 :(得分:3)

无论您在表达式{{1}中用于bit_index的哪种类型,在任何情况下,它都会被提升为T{1} << bit_indexint,并且结果为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)的后续分配可能仍会截断结果。

根据经验,如果要在算术表达式中使用变量,请使用xint。在按位算术上下文中,通常最好使用unsigned int,否则只需使用unsigned

底线:使用signed,或者可能使用unsigned int