整数类型的字符串表示使用的最大字符数?

时间:2016-04-05 15:13:34

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

给定任何(有符号或无符号)整数类型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;
}

2 个答案:

答案 0 :(得分:0)

给定N位的任何整数,转换为基数B,可选符号将包含1个字符,后跟最多log B (1 <&lt;(N-1))个数字,四舍五入。

如果您没有log B 的功能,可以使用

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

将日志 10 转换为log B

因此,例如,32位的整数,转换为基数8(八进制),允许最多1个字符用于符号加上log(1 <&lt; 31)/ log(8)== 1 + 10.3333 == 12最大字符。

至于在编译时进行评估,大多数现代C ++编译器都支持常量求值以及内部函数,如果它们可证明是常数,则可以在编译时进行评估,如上所述。

答案 1 :(得分:0)

对于无符号整数

  1. 您需要编写constexpr对数函数。
  2. 将其应用于std::numeric_limits<T>::max(),然后将其除以基数的对数。
  3. 对于有符号整数,您只需执行相同的操作并添加一个(对于减号)。