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

C++ 整数类型的字符串表示所使用的最大字符数?,c++,c++11,integer,base,constexpr,C++,C++11,Integer,Base,Constexpr,给定任何(有符号或无符号)整数类型T如何最好地确定编译时任何base>0中其字符串表示(包括符号)的最大字符数 template <typename T> constexpr auto getMaxLengthAsString(std::uintmax_t base) -> /* std::uintmax_t ??? */ { /* ??? */ } 模板 constexpr自动获取最大长度字符串(标准::uintmax\t基) ->/*标准::uintmax\u t

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

template <typename T>
constexpr auto getMaxLengthAsString(std::uintmax_t base)
    -> /* std::uintmax_t ??? */
{ /* ??? */ }
模板
constexpr自动获取最大长度字符串(标准::uintmax\t基)
->/*标准::uintmax\u 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;
}
模板
无效示例打印值(T值)无例外{
constexpr static auto const maxLen=getMaxLengthassString(10);
/*忽略线程安全等,以保持此示例简短:*/
静态字符缓冲区[maxLen+1u];
缓冲区[maxLen]='\0';
/*…值到缓冲区的实际转换在此发生*/

cout给定任意N位整数,转换为基数B,可选符号为1个字符,无符号整数最多为logB(1)

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

    到目前为止您做了什么?您只需预先计算它,并从sizeof()中获得一个静态数组数字假设你想出了一些东西。如果你的解决方案不是100%完美呢?在我看来,试图计算要分配的确切字节数是很危险的。你在玩弄高压手段。@SergeyA嗯,对于无符号类型来说很容易,当你只需使用
    uintmax\t
    就可以完成事情时。事情变得复杂得多当
    T
    是有符号整数类型且
    numeric\u limits::min()
    不能与
    uintmax\u T base
    的否定进行常规比较时,因为
    -base
    不能用type
    T
    intmax\u T
    表示。请确认
    -numeric\u limits::min()的结果
    甚至可能无法在
    uintmax\u t
    中表示,因为该标准不保证可以使用相应的无符号类型来表示有符号类型的最负值的求反,或者
    uintmax\u t
    是定义为
    CHAR
    中的位数的宏请注意,我误解了这个问题
    log(1<<(N-1))/log(B)