【问题标题】:Maximum number of characters used by a string representation of an integer type?整数类型的字符串表示使用的最大字符数?
【发布时间】:2016-07-25 15:05:32
【问题描述】:

给定任何(有符号或无符号)整数类型T,我如何在编译时最好地确定任何base > 0 中其字符串表示形式(包括符号)的最大字符数?

template <typename T>
constexpr auto getMaxLengthAsString(std::uintmax_t base)
    -> /* std::uintmax_t ??? */
{ /* ??? */ }

这在一些必须预先分配字符串并且不允许在转换过程中抛出任何异常的情况下很有用。其有用性的一个简短示例如下:

template <typename T>
void examplePrintValue(T value) noexcept {
    constexpr static auto const maxLen = getMaxLengthAsString<T>(10);
    /* Ignoring thread safety etc to keep this example short: */
    static char buffer[maxLen + 1u];
    buffer[maxLen] = '\0';
    /* ... real conversion of value to buffer happens here ... */
    cout << buffer << endl;
}

【问题讨论】:

  • 到目前为止你做了什么?
  • 您可以预先计算它并从 sizeof() 每个基数中获得一个静态数组位数
  • 假设你想出了一些东西。如果您的解决方案不是 100% 完美怎么办? IMO,尝试计算要分配多少的确切字节数是危险的。你正在表演一场高空表演。
  • @SergeyA 好吧,对于无符号类型来说,这很容易,因为我们可以用uintmax_t 来做事。当T 是有符号整数类型并且numeric_limits&lt;T&gt;::min() 不能以常规方式与uintmax_t base 的否定进行比较时,事情变得更加复杂,因为-base 不能用类型Tintmax_t 表示。 Afaik -numeric_limits&lt;T&gt;::min() 的结果甚至可能无法在 uintmax_t 中表示,因为标准不保证有符号类型的最负值的否定可以使用相应的无符号类型或 uintmax_t 来表示。跨度>
  • CHAR_BIT 是一个宏,定义为char 中的位数。不过没关系,我误读了这个问题

标签: c++ c++11 integer base constexpr


【解决方案1】:

对于无符号整数

  1. 你需要写一个constexpr对数函数。
  2. 将其应用于std::numeric_limits&lt;T&gt;::max(),然后除以底的对数。

对于有符号整数,您只需做同样的事情并添加一个(用于减号)。

【讨论】:

    【解决方案2】:

    给定任何 N 位整数,转换为基数 B,您将有 1 个字符作为可选符号,后跟最多 logB(1

    如果没有logB的功能,可以使用

    log(1<<(N-1))/log(B)
    

    将log10转换成logB

    因此,例如,一个 32 位整数,转换为基数 8(八进制),最多允许 1 个字符作为符号加上 log(1

    至于在编译时求值,大多数现代 C++ 编译器都支持常量求值,以及可以在编译时求值的内在函数,如果它们可证明是常量的话。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-29
      • 2022-12-07
      • 2016-05-03
      • 1970-01-01
      • 2019-09-19
      • 2015-02-08
      • 1970-01-01
      • 2014-10-24
      相关资源
      最近更新 更多