Como melhorar a determinação do tamanho do buffer para imprimir vários tipos inteiros?

Ao converter um inteiro em texto, normalmente eu crio umgrande buffer para usar comsprintf() para manter qualquer resultado potencial.

char BigBuffer[50];
sprintf(BugBuffer, "%d", SomeInt);

Eu gostaria de mais espaço eficiente e certamente portátil, então ao invés de50, encontrou a alternativa:
(sizeof(integer_type)*CHAR_BIT*0.302) + 3

// 0.0302 about log10(2)
#define USHORT_DECIMAL_BUFN ((size_t) (sizeof(unsigned short)*CHAR_BIT*0.302) + 3)
#define INT_DECIMAL_BUFN    ((size_t) (sizeof(int)           *CHAR_BIT*0.302) + 3)
#define INTMAX_DECIMAL_BUFN ((size_t) (sizeof(intmax_t)      *CHAR_BIT*0.302) + 3)

int main() {
    char usbuffer[USHORT_DECIMAL_BUFN];
    sprintf(usbuffer, "%hu", USHRT_MAX);
    printf("Size:%zu Len:%zu %s\n", sizeof(usbuffer), strlen(usbuffer), usbuffer);

    char ibuffer[INT_DECIMAL_BUFN];
    sprintf(ibuffer, "%d", INT_MIN);
    printf("Size:%zu Len:%zu %s\n", sizeof(ibuffer), strlen(ibuffer), ibuffer);

    char imbuffer[INTMAX_DECIMAL_BUFN];
    sprintf(imbuffer, "%" PRIdMAX, INTMAX_MIN);
    printf("Size:%zu Len:%zu %s\n", sizeof(imbuffer), strlen(imbuffer), imbuffer);
    return 0;
}

Size:7 Len:5 65535
Size:12 Len:11 -2147483648
Size:22 Len:20 -9223372036854775808

Então oquestões está:
1 Existe algum problema com a equação alternativa?
2 Qual a melhor solução? - como esta alternativa é um pouco desperdício e parece excessivamente complicada.

[EditarResponda]

Respostas fornecem 3 abordagens pensativas:
1 Use buffer [tamanho máximo para o tipo] (Resposta selecionada)
2 asprintf()
3 snprintf()

1 O tamanho máximo do buffer de tempo de compilação usando a equação(sizeof(integer_type)*CHAR_BIT*0.302) + 3 não foi quebrado nem melhorado. O impacto de<locale.h> foi pesquisado como sugerido por @paddy e nenhuma configuração de localidade afetou conversões inteiras%d %x %u %i. Foi descoberto que uma pequena melhora pode ser feita na equação se o tipo for conhecido como assinado ou não assinado (abaixo). @paddy cautela sobre "mais conservador" é um bom conselho.

2 asprintf() é realmente uma boa solução para todos os fins, mas não é portátil. Talvez no pós-C11?

3 snprintf(), embora padrão, conhece problemas de implementação consistentes quando o buffer fornecido é subdimensionado. Isso implica em chamá-lo com um buffer de tamanho excessivo e, em seguida, gerar um buffer de tamanho correto. @jxh sugeriu um buffer de rascunho global seguro para encadear para formar a resposta com um buffer local do tamanho correto. Esta nova abordagem merece a consideração que eu possa usar, mas a questão original se concentrou mais em determinar antes dos(n)printf() chame um tamanho de buffer conservador.

signed ((sizeof(integer_type)*CHAR_BIT-1)*0.302) + 3
unsigned (sizeof(integer_type)*CHAR_BIT*0.302) + 2
*28/93 pode ser utilizado em vez de*0.302.

questionAnswers(4)

yourAnswerToTheQuestion