【问题标题】:What type should I use for the number of bits in a fundamental type?基本类型中的位数应该使用什么类型?
【发布时间】:2018-12-10 22:55:09
【问题描述】:

Fundamental types 在 C++ 中的大小在 1 到 8(可能是 16)之间,在 64 位操作系统上。这意味着它们在内存中占用的位数不高于 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 吗?或者它应该只是一个 int,因为无论如何我都需要检查有效性,即使是 uint8_t 的情况,而 int 是一种更“自然”的数字类型?

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

【问题讨论】:

  • 您希望代码具有怎样的面向未来的能力?当 i25 1024bit 处理器出来时,你还想让代码工作吗?
  • 考虑一下:如果你想要一个类似的clear_bit 函数作为某个位数组类的成员会发生什么?或者,如果您想要一个通用的 clear_bit 可以在任何任意位范围概念上运行怎么办?这就是你应该使用的类型。
  • 我不确定什么是最好的,但如果你匹配操作类型 T 那么我假设你不会失去任何东西,因为它可能会被提升为数学?
  • 我相信 LEWG 选择了int 来获得提议的轮换功能。
  • @Galik 源类型被限制为无符号,但旋转计数为int

标签: c++ bit idioms


【解决方案1】:

无论您在表达式T{1} &lt;&lt; bit_index 中为bit_index 使用什么类型,在任何情况下它都会被提升为intunsigned int,而T{1} &lt;&lt; bit_index 的结果本身就是T{1} 的提升类型。这意味着x &amp; ~(T{1} &lt;&lt; bit_index) 总是产生一个至少“和”int 一样大的类型。

只有当
bit_index &gt;= 0 &amp;&amp; bit_index &lt; (sizeof +T{}) * CHAR_BIT) 时,表达式 T{1} &lt;&lt; bit_index 才定义良好。对x 的后续分配可能仍会截断结果。

根据经验,如果您打算在算术表达式中使用变量,请使用intunsigned intunsigned 通常在按位算术上下文中更可取,否则只需使用 signed

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

【讨论】:

    猜你喜欢
    • 2011-10-19
    • 2013-10-19
    • 2013-10-15
    • 2012-09-01
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 2017-01-28
    相关资源
    最近更新 更多